Подтвердить что ты не робот

Значение $? (знак вопроса доллара) в сценариях оболочки

Что значит

echo $?

значит в программировании оболочки?

4b9b3361

Ответ 1

Это статус выхода последней выполненной команды.

Например, команда true всегда возвращает статус 0, а false всегда возвращает статус 1:

true
echo $? # echoes 0
false
echo $? # echoes 1

Из руководства: (доступно, вызывая man bash в вашей оболочке)

$? Расширяется до статуса выхода последнего выполненного переднего плана.

По соглашению статус выхода 0 означает успех, а ненулевой статус возврата означает сбой. Подробнее о статусах выхода в wikipedia.

Существуют и другие специальные переменные, подобные этому, как вы можете видеть в этом онлайн-руководстве: https://www.gnu.org/s/bash/manual/bash.html#Special-Parameters

Ответ 2

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

Следовательно, при написании сценариев; Я склонен использовать следующий синтаксис

if [ $? -eq 0 ]; then
 # do something
else
 # do something else
fi

Сравнение должно быть сделано на равных 0 или не равных 0.

** Обновление на основе комментария: в идеале, вы не должны использовать вышеуказанный блок кода для сравнения, обратитесь к комментариям и объяснениям @tripleee.

Ответ 3

Он имеет последний код состояния (значение выхода) для команды.

Ответ 4

echo $? - Дает СТАТУС ВЫХОДА последней выполненной команды. Это СОСТОЯНИЕ ВЫХОДА, скорее всего, будет числом с НУЛЕМ, означающим Успех, и любым НУЛЕВОЙ величиной, указывающей Отказ

? - Это один специальный параметр/переменная в bash.

$? - Это дает значение, хранящееся в переменной "?".

Некоторые аналогичные специальные параметры в BASH: 1,2, *, # (обычно в команде echo видны как $ 1, $ 2, $ *, $ # и т.д.,).

Ответ 6

См . Руководство по Bash в разделе 3.4.2 Специальные параметры:

? - Расширяется до состояния выхода последнего выполненного переднего конвейера.

Это немного сложно найти, потому что он не указан как $? (имя переменной "просто" ?). Также смотрите раздел статуса выхода, конечно ;-)

Удачного кодирования.

Ответ 7

Выводит результат последней выполненной команды unix

0 implies true
1 implies false

Ответ 8

Пример минимального состояния выхода POSIX C

Чтобы понять $?, вы должны сначала понять концепцию статуса завершения процесса.

В Linux:

  • когда процесс вызывает системный вызов exit, ядро сохраняет значение, переданное системному вызову, даже после того, как процесс умирает.

    Системный вызов выхода вызывается функцией ANSI C exit() и косвенно, когда вы делаете return из main.

  • процесс, который вызвал выходящий дочерний процесс (Bash), часто с помощью fork + exec, может получить состояние завершения дочернего процесса с помощью системного вызова wait

Рассмотрим код Bash:

$ false
$ echo $?
1

C "эквивалент":

false.c:

#include <stdlib.h> /* exit */

int main() {
    exit(1);
}

bash.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/info/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 не определяет значение каких-либо значений, а 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