Подтвердить что ты не робот

Что такое "$?"? дать нам точно в оболочке script?

Я видел код, написанный где-то в сети, и я хотел знать, что именно делает "$?". 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

4b9b3361

Ответ 1

$? - переменная, содержащая возвращаемое значение последней команды, которую вы выполнили.

Пример программы C (example.c):

int main() { return 1; }

Пример Bash:

gcc -o example example.c
./example
echo $? # prints 1

Ответ 2

В большинстве ответов отсутствует подробная информация. Окончательный ответ найден в стандарте POSIX для оболочки в разделе о специальных параметрах:

$? Расширяется до десятичного состояния выхода из последнего конвейера (см. "Трубопроводы" ).

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

А как насчет выполнения конвейеров в фоновом режиме, например grep foo bigfile|head -n 10 > result &?

Их статус выхода можно получить через wait после завершения последней команды конвейера. Фоновый процесс pid доступен как $!, а $? сообщает только о том, правильно ли запущена фоновая команда.

Еще одна особенность, о которой стоит упомянуть, заключается в том, что статус выхода обычно находится в диапазоне от 0 до 255, причем от 128 до 255 указывает, что процесс вышел из-за сигнала. Возврат других значений из программы C, вероятно, не будет точно отражен в $?.

Ответ 3

Это код возврата из последней выполненной команды.

По соглашению 0 - успешный выход, а ненулевой - некоторая ошибка.

Ответ 4

Эта специальная переменная показывает статус выхода последней команды, которая была запущена в script или в командной строке. Например, в командной строке пользователь может ввести

 who; echo $?

Тогда выход будет

 user  tty7         2014-07-13 19:47
 0

Здесь отображается вывод who и статус выхода команды. A script будет одинаковым.

 #!/bin/bash
 who
 echo $?

Выход: 0

Ответ 5

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

if $?my_var then
    echo my_var exists
endif