2013-10-06 4 views
-2

я не знаю, что означает, что возвращаемое значениеUnix возвращает значение «-bash»

grep abc Letters 


echo $? 
0 
echo $0 

дает «-bash» что означает «-bash» возвращаемое значение означает,

+0

должен быть перенесен на http://unix.stackexchange.com/ –

+1

@ umläute: я не уверен, что его нужно перенести.Это вопрос о программировании, а вопросы программирования, специфичные для Unix, приемлемы для Stack Overflow. (Это также было бы правильным вопросом для сайта Unix.) –

+0

'$ 0' - это не возвращаемое значение; это 'argv [0]'. –

ответ

0

Возвращение статуса последней командная оболочка представлено $?:

date 
echo $? 
0 

Здесь 0 означает успешное возвращение из ранее завершенной команды (date) и любых средств ненулевого значения статус отказа.

Когда вы обращаетесь к $0, на самом деле это имя исполняемого файла в оболочке, и в вашем случае это -bash, так как вы используете его на оболочке.

1

Вопрос следует переместить в https://unix.stackexchange.com/.

Но так или иначе, $0 - это значение переменной, которая содержит имя приложения, выполняющего эту команду. Это как argv[0] в С.

Пример:

[email protected]:~|⇒ echo $0 # I'm in zsh now 
/bin/zsh 
[email protected]:~|⇒ bash  # let's run bash: 
[email protected]:~$ echo $0 
bash 
[email protected]:~$ sh   # we need to go deeper: 
$ echo $0 
sh 
$ zsh      # deeper! 
[email protected]:~|⇒ echo $0 
zsh 
[email protected]:~|⇒   # hit Ctrl-D (pop one level): 
$ echo $0 
sh 
$       # pop again: 
[email protected]:~$ echo $0 
bash 
[email protected]:~$ exit  # again: 
[email protected]:~|⇒ echo $0 
/bin/zsh      # we're at the starting point now 
1

Значение $0 объясняется в Баш ручной (here, в нижней части страницы):

Дополняет имя сценария оболочки или оболочки. Это устанавливается в инициализации оболочки . Если Bash вызывается с файлом команд (см. Shell Scripts), $ 0 устанавливается на имя этого файла. Если Bash запускается с -c (см. Invoking Bash), то $0 устанавливается в первый аргумент после строки, которая должна быть выполнена, если таковая имеется. В противном случае он задается именем файла, используемым для вызова Bash, как задано аргументом 0.

(К сожалению, это трудно найти $0 в руководстве Баш, так как он указан как только 0.)

По соглашению, если текущий bash процесс является Войти оболочки, $0 (argv[0] в C термины) изменяется либо на bash, либо на процесс входа в систему, добавив в начале символ -.

О некоторых системах, /bin/sh является символической ссылкой на /bin/bash. Если это так, и если bash вызывается через символическую ссылку /bin/sh, то $0 будет sh или -sh.

$?, также поясняемый в руководстве Bash, «Расширяется до статуса выхода последнего выполненного переднего плана». Более просто, это статус самой последней выполненной команды (в вашем случае grep abc Letters), обычно 0, если эта команда преуспела, или некоторое ненулевое значение (часто, но не всегда, 1), если оно не выполнено.

+0

Классически это был процесс входа в систему, который устанавливал 'argv [0]' to '-bash', чтобы позволить оболочке знать, что это была оболочка входа, а не сама оболочка, которая обычно не может существенно изменить свой список аргументов. –

+0

@JonathanLeffler: быстрый эксперимент на Linux показывает, что программа C, которая выполняет 'argv [0] [0] = '-';', изменяет имя программы, которое появляется на выходе 'ps'. –

+0

OK; У меня больше нет доступа к Solaris, HP-UX, AIX, но я уверен, что они этого не сделали или не сделали (за последние пару лет). Mac OS X принимает изменение (все аргументы). Я помню эту трудность, потому что это было разочарование тем, что не удалось перезаписать пароли, переданные в командной строке на всех платформах Unix. В каком-то соответствующем коде есть комментарий: 'case 'p':/* Пароль - сомнительная безопасность */password = STRDUP (optarg);/* Перезаписать пароль, чтобы уменьшить вероятность его просмотра через ps, но он не делает ничего полезного в Solaris 7. */memset (optarg, 'X', strlen (optarg)); перерыв; '. –

Смежные вопросы