Что значит
echo $?
значит в программировании оболочки?
shell
scripting
special-characters
Харшай Бурадкар
источник
источник
Ответы:
Это статус выхода последней выполненной команды.
Например, команда
true
всегда возвращает статус0
иfalse
всегда возвращает статус1
:Из руководства: (доступно через вызов
man bash
в вашей оболочке)По соглашению статус выхода
0
означает успех, а ненулевой статус возврата означает сбой. Узнайте больше о статусах выхода в Википедии .Есть и другие специальные переменные, подобные этой, как вы можете видеть в этом онлайн-руководстве: https://www.gnu.org/s/bash/manual/bash.html#Special-Parameters
источник
$
и?
это два разных параметра$?
, которые не отображаются на странице руководства bash (1).$?
возвращает значение выхода последней выполненной команды.echo $?
выводит это значение на консоль Ноль подразумевает успешное выполнение, в то время как ненулевые значения отображаются на различные причины сбоя.Следовательно, при написании сценариев; Я склонен использовать следующий синтаксис
Сравнение должно быть сделано на равных
0
или не равных0
.** Обновление на основе комментария: в идеале, вы не должны использовать вышеуказанный блок кода для сравнения, обратитесь к комментариям и объяснениям @tripleee.
источник
cmd; if [ $? -eq 0 ]; then
должно быть подвергнуто рефакторингуif cmd; then
. Сама цель изif
(и другие операторы управления потоком в оболочке), чтобы выполнить команду и проверьте его состояние выхода.if cmd;
Некоторые условия могут быть не очень читабельными, особенно когда cmd ссылается на другой скрипт.[ 1 ]
и[ 0 ]
оба верны;[
без оператора проверяет, является ли аргумент непустой строкой.vendor/bin/drush status bootstrap | grep -q $(vendor/bin/drush php-eval 'if (function_exists("t")) echo t("Successful");') &> /dev/null;
. Если бы мне пришлось поместить это в одну строку,if [ ... ]
это было бы ужасно нечитаемо. Я планирую сохранить вывод этой строки в переменной, так что я могу сказатьif [ $drupal_installed -eq 0 ]
позже.echo $? - Дает СТАТУС ВЫХОДА последней выполненной команды . Это СОСТОЯНИЕ ВЫХОДА, скорее всего, будет числом с НУЛЕМ, означающим Успех, и любым НУЛЕВОЙ величиной, указывающей Отказ
? - Это один специальный параметр / переменная в bash.
$? - Это дает значение, хранящееся в переменной «?».
Некоторые аналогичные специальные параметры в BASH: 1,2, *, # (обычно в команде echo видны как $ 1, $ 2, $ *, $ # и т. Д.,).
источник
У него есть последний код состояния (значение выхода) команды.
источник
Пример минимального состояния выхода POSIX C
Чтобы понять
$?
, вы должны сначала понять концепцию статуса выхода процесса, которая определяется POSIX . В Linux:когда процесс вызывает
exit
системный вызов, ядро сохраняет значение, переданное системному вызову (int
), даже после того, как процесс умирает.Системный вызов выхода вызывается
exit()
функцией ANSI C, и косвенно, когда вы делаетеreturn
изmain
.процесс, который вызвал выходящий дочерний процесс (Bash), часто с
fork
+exec
, может получить статус выхода дочернего процесса с помощьюwait
системного вызоваРассмотрим код Bash:
C «эквивалент» это:
false.c
bash.c
Скомпилируйте и запустите:
Вывод:
В Bash, когда вы нажимаете Enter, происходит форк + exec + wait, как описано выше, а затем bash устанавливает
$?
состояние завершения разветвленного процесса.Примечание: для встроенных команд, таких как
echo
, процесс не нужно запускать, а Bash просто устанавливает$?
0 для имитации внешнего процесса.Стандарты и документация
POSIX 7 2.5.2 «Специальные параметры» http://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html#tag_18_05_02 :
man bash
«Специальные параметры»:Затем ANSI C и POSIX рекомендуют:
0
означает, что программа была успешнойдругие значения: программа как-то не удалась.
Точное значение может указывать тип отказа.
ANSI C не определяет значение каких-либо значений, а POSIX определяет значения больше 125: что означает «POSIX»?
Bash использует статус выхода для
if
В Bash мы часто
$?
неявно используем статус выхода для управленияif
операторами, как в:где
true
программа, которая просто возвращает 0.Вышеуказанное эквивалентно:
И в:
[
это просто программа со странным именем (и встроенной в Bash, которая ведет себя так же, как она) и1 = 1 ]
ее аргументами, см. также: Разница между одинарными и двойными квадратными скобками в Bashисточник
С http://www.gnu.org/s/bash/manual/bash.html#Special-Parameters
источник
См . Руководство по Bash в разделе 3.4.2. Специальные параметры :
Это немного сложно найти, потому что он не указан как
$?
(имя переменной «просто»?
). Также смотрите раздел статуса выхода , конечно ;-)Удачного кодирования.
источник
Выводит результат последней выполненной команды unix
источник