Ответы:
$?расширяется до состояния выхода последнего выполненного переднего конвейера. См. Раздел « Специальные параметры» руководства по Bash .
Проще говоря, это статус выхода последней команды.
Ответ 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
Это последнее использование быстрее, не загрязняет пространство имен переменных оболочки тем, что составляет временные переменные, часто может быть намного более читабельным для людей и поощряет использование «позитивной логики», практики написания условных выражений без отрицаний, которая имеет когнитивный характер. простота в большинстве ситуаций. Это устраняет с использованием $?по большей части.
В дополнение к тому, что сказал cjm , если значение $?равно 0, то предыдущий процесс завершился нормально (или успешно). В противном случае произошла какая-то ошибка.
diffвыходит с 0, если сравниваемые файлы одинаковы, с 1, если они разные, и 2 - ошибка.
$?-Выход из последней выполненной команды.
$0Имя файла текущего скрипта.
$#Количество аргументов, предоставленных сценарию.
$$Номер процесса текущей оболочки. Для сценариев оболочки это идентификатор процесса, под которым они выполняются.
$? предоставьте нам статус выполнения последней команды на выполнение. Значение «0» означает, что команда была выполнена успешно, а «1» не для успеха.
$?определяет статус выхода выполненной команды. $цифры (например $1, $2и т. д.) представляют параметры в сценарии оболочки.