Ответ 1
$?
- переменная, содержащая возвращаемое значение последней команды, которую вы выполнили.
Пример программы C (example.c
):
int main() { return 1; }
Пример Bash:
gcc -o example example.c
./example
echo $? # prints 1
Я видел код, написанный где-то в сети, и я хотел знать, что именно делает "$?". do/дать нам. Гуглинг не помог.
Вот код, который я видел в нем:
#!/bin/sh
ping -c 2 localhost
if [ $? != 0 ] ; then
echo "Couldn't ping localhost, weird"
fi
ping -c 2 veryweirdhostname.noend
if [ $? != 0 ] ; then
echo "Surprise, Couldn't ping a very weird hostname.."
fi
echo "The pid of this process is $$"
Взято из: http://efod.se/writings/linuxbook/html/shell-scripts.html
$?
- переменная, содержащая возвращаемое значение последней команды, которую вы выполнили.
Пример программы C (example.c
):
int main() { return 1; }
Пример Bash:
gcc -o example example.c
./example
echo $? # prints 1
В большинстве ответов отсутствует подробная информация. Окончательный ответ найден в стандарте POSIX для оболочки в разделе о специальных параметрах:
$? Расширяется до десятичного состояния выхода из последнего конвейера (см. "Трубопроводы" ).
Не удивляйтесь конвейеру слов, потому что даже простая команда, такая как ls
, является грамматически конвейером, состоящим из одной команды. Но тогда, что $?
для конвейера с несколькими командами? Это статус выхода последней команды в конвейере.
А как насчет выполнения конвейеров в фоновом режиме, например grep foo bigfile|head -n 10 > result &
?
Их статус выхода можно получить через wait
после завершения последней команды конвейера.
Фоновый процесс pid доступен как $!
, а $?
сообщает только о том, правильно ли запущена фоновая команда.
Еще одна особенность, о которой стоит упомянуть, заключается в том, что статус выхода обычно находится в диапазоне от 0 до 255, причем от 128 до 255 указывает, что процесс вышел из-за сигнала. Возврат других значений из программы C, вероятно, не будет точно отражен в $?
.
Это код возврата из последней выполненной команды.
По соглашению 0 - успешный выход, а ненулевой - некоторая ошибка.
Эта специальная переменная показывает статус выхода последней команды, которая была запущена в script или в командной строке. Например, в командной строке пользователь может ввести
who; echo $?
Тогда выход будет
user tty7 2014-07-13 19:47
0
Здесь отображается вывод who и статус выхода команды. A script будет одинаковым.
#!/bin/bash
who
echo $?
Выход: 0
другие ответы охватывают bash довольно хорошо, но вы не указываете оболочку в своем вопросе. В csh (и tcsh) $?
можно использовать для запроса существования переменных, например
if $?my_var then
echo my_var exists
endif