Что такое `$?`? Это переменная?

23

Вопрос довольно прямой. Я могу получить код выхода предыдущей команды с помощью $?. Но что именно?

Я не думаю, что это переменная, потому что в имени переменной не может быть никаких специальных символов, кроме _.

foo?foo=10

приведет к ошибке: foo?foo=10: command not found

Так что, если это не переменная, что это? Есть ли другие, как это?

daltonfury42
источник
6
stackoverflow.com/questions/6834487/… вот,
пожалуйста

Ответы:

23

Что это такое?

$? является встроенной переменной, в которой хранится состояние выхода команды, функции или самого скрипта.

$?читает состояние выхода последней выполненной команды. После возврата из функции $?выдает статус выхода последней команды, выполненной в функции. Это способ Баша дать функциям «возвращаемое значение». Возвращает 0в случае успеха или целое число в диапазоне 1 - 255ошибок.

Есть ли другие, как это тоже?

Да, в bash есть несколько таких встроенных переменных. Вы можете увидеть список здесь . См. Http://www.tldp.org/LDP/abs/html/exit-status.html.

Рон
источник
1
То есть он доступен только в оболочке bash?
daltonfury42
4
@ daltonfury42 нет, любая оболочка , которая пытается иметь некоторую совместимость с Bourne оболочки будет поддерживать его ( в том числе dash, ksh, zsh, среди прочих).
Муру
2
csh и fish используют $statusдля той же цели
Гленн Джекман
22

$?переменная, но особая, поэтому допускаются специальные символы. ($?)Расширяется до состояния выхода последнего выполненного переднего конвейера.

Это не единственный, оболочка обрабатывает несколько параметров специально. На эти параметры можно ссылаться только; присвоение им не допускается:

Variable    Meaning
$0          Filename of script
$1          Positional parameter #1
$2 - $9     Positional parameters #2 - #9
${10}       Positional parameter #10
$#          Number of positional parameters
"$*"        All the positional parameters (as a single word) *
"$@"        All the positional parameters (as separate strings)
${#*}       Number of positional parameters
${#@}       Number of positional parameters
$?          Return value
$$          Process ID (PID) of script
$-          Flags passed to script (using set)
$_          Last argument of previous command
$!          Process ID (PID) of last job run in background

* Must be quoted, otherwise it defaults to $@.

Источники:

Сильвен Пино
источник
2
"$*"это не только все позиционные параметры как одно слово, но и все позиционные параметры, разделенные первым символом IFSкак одно слово. Поскольку результат будет подвергаться разбиению поля, если он не заключен в кавычки, эффект как будто $@используется в кавычках без кавычек.
Муру
1
Чтобы быть уверенным: без кавычек $ @ и $ * одинаковы, потому что они оба могут быть разделены слова. В кавычках «$ @» сохраняет разбиение слов по позиционным параметрам, даже если отдельный параметр содержит символ в IFS.
Кодзиро
1
Есть ли упоминания о том, с каких пор это используется для снарядов? Интересно, взял ли Perl их из сценариев оболочки?
simbabque
Это предшествует Perl десятилетиями (или, по крайней мере, годами). Синтаксис оболочки сильно повлиял на синтаксис Perl. (Perl родился в 1987 году, и большая часть этого синтаксиса пришла из оригинальной оболочки Bourne (1977). Я не на 100%, когда был введен $ _, но это было почти наверняка задолго до 1987 года.
Popup
6

$?это специальный параметр оболочки (переменная).

Как правило, все определяемые пользователем переменные должны быть названы с использованием только символов из класса символов, [:alnum:]т. Е. [a-zA-Z0-9_](Также не может начинаться с [0-9]).

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

Вы можете прочитать это, чтобы получить больше представления о переменных.

heemayl
источник
4

$?это специальная переменная в bash, которая всегда содержит код возврата / выхода последней выполненной команды.

Вы можете просмотреть его в терминале, запустив echo $?.

Коды возврата находятся в диапазоне [0; 255].
Код возврата 0обычно означает, что все в порядке.
Другие значения указывают на ошибки. Большинство приложений возвращают 1или пользовательские значения. Если команда не найдена, переменная обычно содержит127

Если вы хотите установить для этой переменной определенное значение, вы можете легко сделать это, bash -c "exit 5"например, для возврата кода возврата 5.

Byte Commander
источник
Функция оболочки - это POSIX-совместимый способ установки состояния выхода без необходимости разветвления. setstatus() { return 5; }
Кодзиро