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



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

697   9  

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 $?
1

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

ложно.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?

это возвращенный код ошибки последней выполненной команды. 0 = успех

$? - это состояние выхода команды, при котором можно последовательно выполнить ряд команд.

пример

command1 && command2 && command3

command2 выполняется, если command1's$? производит success (0) и command3 выполняется, если $? of command2 даст a success

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

Он хорошо подходит для отладки в случае выхода вашего скрипта, если используется "set-e". Например, поставить "echo $?"после команды, которая вызывает его для выхода и увидеть возвращенное значение ошибки.

Comments

    Ничего не найдено.