Яке значення $? в сценарії оболонки?


Відповіді:



26

Відповідь Кіма правильна, але $?її можна використовувати дурними способами в сценаріях оболонок, і я хотів би застерегти від цього. Багато поганих сценаріїв оболонки мають повторний зразок коду:

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

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


5
Більш складний синтаксис необхідний, коли є більше можливостей, ніж лише 0 або 1 - програми часто передають корисну інформацію через вихідні коди. А також корисно, якщо вам потрібно буде знову використовувати це значення згодом у коді (наприклад, для ведення журналів).
mattdm

3

На додаток до сказаного cjm , якщо значення $?дорівнює 0, попередній процес закінчувався нормально (або успішно). Інакше виникла помилка.


8
Це не завжди сигналізує про помилку. diffвиходить з 0, якщо порівняні файли однакові, з 1, якщо вони різні, і 2 - помилка.
Шон Дж. Гофф

2
Він ніколи не сигналізує про помилку. Це лише статус виходу попередньої команди. Річ "0, якщо нормальний вихід" - це конвенція (EXIT_SUCCESS / EXIT_FAILURE)
aviraldg

3

$?-Стату виходу останньої виконаної команди.

$0-Ім’я поточного сценарію.

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

$$-Номер процесу поточної оболонки. Для скриптів оболонок це ідентифікатор процесу, під яким вони виконуються.


0

$? надайте нам статус виконання останньої команди виконувати під час запиту. Значення "0" позначає, що команда була виконана успішно, а "1" - не для успіху.


2
Не тільки в інтерактивних підказках, але і в сценаріях, і будь-яке ненульове значення означає збій.
Kusalananda

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.