Каково значение $? в сценарии оболочки?

Если Вы знаете название файла заранее, можно использовать -O опция к wget для сообщения этого, где записать файл.

wget -O /var/cache/foobar/stackexchange-site-list.txt http://url.to/stackexchange-site-list.txt
36
20.02.2011, 19:58
6 ответов

$? расширяется до статуса выхода последний раз выполняемого приоритетного конвейера. Посмотрите раздел Special Parameters руководства Bash.

В более простых терминах это - статус выхода последней команды.

43
27.01.2020, 19:36

Ответ 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

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

26
27.01.2020, 19:36
  • 1
    Более сложный синтаксис необходим, когда существует больше возможностей, чем всего 0 или 1 — программы часто передают полезную информацию через коды выхода. И также полезно, если необходимо снова использовать то значение позже в коде (для входа, например). –  mattdm 20.02.2011, 22:42

В дополнение к какой сказанный cjm, если значение $? 0, затем предыдущий процесс действительно обычно завершался (или успешно). Иначе была некоторая ошибка.

3
27.01.2020, 19:36
  • 1
    Это не всегда сигнализирует об ошибке. diff выходы с 0, если сравненные файлы являются тем же с 1, если они отличаются, и 2, являются ошибкой. –  Shawn J. Goff 20.02.2011, 17:04
  • 2
    Это никогда не сигнализирует об ошибке. Это - только статус выхода предыдущей команды. "0, если нормальный выход" вещь является конвенцией (EXIT_SUCCESS/EXIT_FAILURE) –  aviraldg 20.02.2011, 19:41

$? определяет статус выхода выполняемой команды. $ сопровождаемый числами (например. $1, $2, и т.д.), представляет параметры в сценарии оболочки.

-3
27.01.2020, 19:36

$?- Статус выхода последней выполненной команды.

$0-Имя файла текущего скрипта.

$#-Количество аргументов, передаваемых сценарию.

$$-Номер процесса текущей оболочки. Для сценариев оболочки это идентификатор процесса, под которым они выполняются.

9
27.01.2020, 19:36

$? предоставьте нам статус выполнения последней команды выполнения в приглашении. Значение «0» означает, что команда была выполнена успешно, а «1» — неуспешно.

0
27.01.2020, 19:36

Теги

Похожие вопросы