що означає помилки тире "-` перед командою" bash` on "не знайдено"?


28

Коли ви введете недійсну команду під час запиту bash, ви отримаєте повідомлення

-bash: {command}: command not found

Що означає -на самому початку?


Як саме ви виконуєте команду? Я намагався повторити, але я не отримую однакових результатів - наприклад,> jhgjbjbkjln: command not found- немає -bash: . Ви використовуєте bashв Unix, Linux, OSX, ...? Я запитую, тому що, можливо, це щось конкретне реалізація, поставлене перед повідомленням про помилку за замовчуванням, і це нічого не означає ... можливо.
jimm-cl

@jim Спробуйте, ssh computernameі ваша команда не рахує копіювати.
Бернхард

Відповіді:


27

Це означає, що це оболонка для входу.

Від man bash:

Оболонка входу - це той, чий перший символ нуля аргументу - -, або той, що розпочався з опції --login.

bashтермінології аргумент "zeroth" - це ім'я команди, яке, у вашому випадку, було bash.) bashВикористовує це як сигнал для виконання вхідних дій, таких як виконання .bash_profileтощо.

Один із способів автоматичного додавання тире - це запуск оболонки exec. З посібника Bash :

exec [-cl] [-a name] [command [arguments]]

[...] Якщо -lопція надається, оболонка ставить тире на початку нульового аргументу, переданого команді .

Приклад

Порівняйте ці дві спроби запустити команду nonexistent. Перший без -l:

$ exec bash
$ nonexistent
bash: nonexistent: command not found

І, по-друге, з:

$ exec -l bash
$ nonexistent
-bash: nonexistent: command not found

3
Я думаю, що частина документації, яку ви цитуєте, не відповідає вашому поясненню. Той факт , що exec -lприєднує прочерк можливий шлях , який може привести до баш буде працювати як -bash, але це само по собі не говорить , що це Ввійти оболонка, і є дуже хороший шанс , що ОП не використовується exec -lвзагалі . Частина документації, яка говорить про те, що -bashробить її оболонкою для входу, - це "ІНВОКАЦІЯ" Оболонка входу - це той, чий перший символ аргументу нульовий - -, або той, що розпочався з опції --login. "
hvd

@hvd, погодився. Ця відповідь, хоча і правильна, не відповідає суті.
Стефан Шазелас

1
"Нульовий аргумент" - це не bashтермінологія, а конвенція Unix + індексація C: Кожна програма отримує список параметрів, початковий запис яких - назва програми, а потім - аргументи. Оскільки масиви C індексуються, починаючи з нуля, аргумент нуль (тобто нульовий аргумент) - це назва програми, а фактичні аргументи починаються з індексу 1.
celtschk

15

Інша відповідь - це добре, наскільки це стосується, але варто згадати, що функція є загальнішою, ніж баш.

З давніх часів loginпрограма передбачувала тире, argv[0]коли вона виконує оболонку користувача, і оболонка визнала це ознакою того, що вона повинна вести себе як "оболонка входу". Це задокументовано на сторінках V7 man тут: login (1) , sh (1) .

Усі програми, які надають послугу, схожу на вхід (автентифікують користувача та запускають оболонку), повинні дотримуватися правила "додавати тире". Наприклад, sshd робить так, як ви можете бачити в ssh / session.c під цим коментарем:

/*
 * If we have no command, execute the shell.  In this case, the shell
 * name to be passed in argv[0] is preceded by '-' to indicate that
 * this is a login shell.
 */

Усі снаряди розпізнають провідну тире. Еквівалентний -lваріант не існує в класичній оболонці Bourne або оригінальному csh, але у більшості нових оболонок (bash, dash, ksh, yash, tcsh, zsh, rc, es, fish та будь-яка напівновіша версія csh) є.


2
Незважаючи на те, що зараз у більшості оболонок є така -lопція, вона loginвсе ще не використовується. Очікується, що всі оболонки розпізнають префікс argv[0]як "офіційний" механізм.
Бармар
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.