В чем смысл $? в сценарии оболочки?

При просмотре одного сценария оболочки я увидел термин «$?». Каково значение этого термина?

27 голосов | спросил Renjith G 20 FebruaryEurope/MoscowbSun, 20 Feb 2011 14:43:35 +0300000000pmSun, 20 Feb 2011 14:43:35 +030011 2011, 14:43:35

4 ответа


36

$? расширяется до статуса выхода последнего выполненного конвейера переднего плана. См. раздел «Специальные параметры» руководства Bash .

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

ответил cjm 20 FebruaryEurope/MoscowbSun, 20 Feb 2011 14:50:28 +0300000000pmSun, 20 Feb 2011 14:50:28 +030011 2011, 14:50:28
22

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

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

ответил Bruce Ediger 20 FebruaryEurope/MoscowbSun, 20 Feb 2011 18:41:38 +0300000000pmSun, 20 Feb 2011 18:41:38 +030011 2011, 18:41:38
3

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

ответил Barun 20 FebruaryEurope/MoscowbSun, 20 Feb 2011 16:48:09 +0300000000pmSun, 20 Feb 2011 16:48:09 +030011 2011, 16:48:09
1

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

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

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

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

ответил Midhun S Sivan 7 J000000Friday17 2017, 12:21:48

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

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132