9 ответов:
$?используется для поиска возвращаемого значения последней выполненной команды. Попробуйте следующее в консоли:ls somefile echo $?если (независимо от того, является ли это файл или каталог), вы получите возврат стоимости выдано
lsкоманда, которая должна быть0(по умолчанию "успех" возвращаемое значение). Если он не существует, вы должны получить число, отличное от 0. Точное количество зависит от программы.для многих программ вы можете найти номера и их значение в соответствующей справочной странице. Они обычно описываются как" состояние выхода " и могут иметь свой собственный раздел.
возвращаемое значение ранее выполненного процесса.
10.4 получение возвращаемого значения программы
в bash, возвращаемое значение программы хранится в специальной переменной называется $?.
это иллюстрирует, как захватить возвращаемое значение программы, I предположим, что каталог dada не существует. (Это было также предложил Майк)
#!/bin/bash cd /dada &> /dev/null echo rv: $? cd $(pwd) &> /dev/null echo rv: $?посмотреть Руководство По Программированию Bash для новые подробности.
минимальный пример C
понять
$?, вы должны сначала понять концепцию статус выхода процесса.В Linux:
когда процесс вызывает
exitсистемный вызов, ядро сохраняет значение, переданное системному вызову, даже после того, как процесс умирает.системный вызов exit вызывается
exit()функция ANSI C, и косвенно, когда вы делаетеreturnотmain.процесс, который вызвал выходящий дочерний процесс (Bash), часто с
fork+exec, может получить статус выхода ребенка сwaitсистемный вызоврассмотрим код Bash:
$ false $ echo $? 1C "эквивалент":
ложно.c:
#include <stdlib.h> /* exit */ int main() { exit(1); }Баш.c:
#include <unistd.h> /* execl */ #include <stdlib.h> /* fork */ #include <sys/wait.h> /* wait, WEXITSTATUS */ #include <stdio.h> /* printf */ int main() { if (fork() == 0) { /* Call false. */ execl("./false", "./false", (char *)NULL); } int status; /* Wait for a child to finish. */ wait(&status); /* Status encodes multiple fields, * we need WEXITSTATUS to get the exit status: * http://stackoverflow.com/questions/3659616/returning-exit-code-from-child **/ printf("$? = %d\n", WEXITSTATUS(status)); }в 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 не определяет значение любых vaues, а POSIX задает значения больше 125:я никогда не понимал: что такое POSIX?
Bash использует статус выхода для
ifв Bash мы часто используем статус выхода
$?неявно контролироватьifзаявления как в:if true; then : fiздесь
true- это программа, которая просто возвращает 0.выше эквивалентно:
true result=$? if [ $result = 0 ]; then : fiи здесь:
if [ 1 = 1 ]; then : fi
[это просто программа со странным именем (и встроенный Bash, который ведет себя так же), и1 = 1 ]его аргументы см. Также:в чем разница между одинарные и двойные квадратные скобки в Bash?
$?- это состояние выхода команды, при котором можно последовательно выполнить ряд команд.пример
command1 && command2 && command3
command2выполняется, еслиcommand1's$?производитsuccess (0)иcommand3выполняется, если$?ofcommand2даст asuccess
Он хорошо подходит для отладки в случае выхода вашего скрипта, если используется "set-e". Например, поставить "echo $?"после команды, которая вызывает его для выхода и увидеть возвращенное значение ошибки.
Comments