В чем смысл $? в сценарии оболочки?


Ответы:



26

Ответ Cjm верен, но $?может использоваться глупыми способами в сценариях оболочки, и я хотел бы предостеречь против этого. Многие плохие сценарии оболочки имеют повторяющийся шаблон кода:

run_some_command
EXIT_STATUS=$?

if [ "$EXIT_STATUS" -eq "0" ]
then
    # Do work when command exists on success
else
    # Do work for when command has a failure exit
fi

Если это вообще возможно (проблемы с читаемостью иногда мешают), вы должны кодировать эту ситуацию по-другому:

if run_some_command
then
    # Do work when command exists on success
else
    # Do failure exit work
fi

Это последнее использование быстрее, не загрязняет пространство имен переменных оболочки тем, что составляет временные переменные, часто может быть намного более читабельным для людей и поощряет использование «позитивной логики», практики написания условных выражений без отрицаний, которая имеет когнитивный характер. простота в большинстве ситуаций. Это устраняет с использованием $?по большей части.


5
Более сложный синтаксис необходим, когда имеется больше возможностей, чем просто 0 или 1 - программы часто передают полезную информацию через коды выхода. И это также полезно, если вам необходимо повторно использовать это значение позже в коде (например, для регистрации).
Mattdm

3

В дополнение к тому, что сказал cjm , если значение $?равно 0, то предыдущий процесс завершился нормально (или успешно). В противном случае произошла какая-то ошибка.


8
Это не всегда сигнализирует об ошибке. diffвыходит с 0, если сравниваемые файлы одинаковы, с 1, если они разные, и 2 - ошибка.
Шон Дж. Гофф

2
Это никогда не сигнализирует об ошибке. Это только состояние выхода предыдущей команды. «0, если нормальный выход» - это соглашение (EXIT_SUCCESS / EXIT_FAILURE)
aviraldg

3

$?-Выход из последней выполненной команды.

$0Имя файла текущего скрипта.

$#Количество аргументов, предоставленных сценарию.

$$Номер процесса текущей оболочки. Для сценариев оболочки это идентификатор процесса, под которым они выполняются.


0

$? предоставьте нам статус выполнения последней команды на выполнение. Значение «0» означает, что команда была выполнена успешно, а «1» не для успеха.


2
Не только в интерактивных подсказках, но и в сценариях, и любое ненулевое значение означает сбой.
Кусалананда

-3

$?определяет статус выхода выполненной команды. $цифры (например $1, $2и т. д.) представляют параметры в сценарии оболочки.


Возможно, вы захотите прочитать правильный ответ ...
jasonwryan
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.