Що таке `$?`? Це змінна?


23

Питання досить прямо вперед. Я можу отримати код виходу попередньої команди за допомогою $?. Але що це саме?

Я не думаю, що це змінна, тому що ви не можете мати спеціальних символів в імені змінної, крім _.

foo?foo=10

це призведе до помилки: foo?foo=10: command not found

Тож якщо це не змінна, що це? Чи є інші, як це?


Відповіді:


23

Що це?

$? це вбудована змінна, яка зберігає статус виходу команди, функції або самого сценарію.

$?зчитує стан виходу останньої виконаної команди. Після повернення функції $?дає статус виходу останньої команди, виконаної у функції. Це спосіб Баша надати функціям "повернене значення". Помилка повертається 0на успіх або ціле число в діапазоні 1 - 255.

Чи є й інші подібні?

Так, в bash є кілька таких вбудованих змінних. Список можна переглянути тут . Зверніться за посиланням: http://www.tldp.org/LDP/abs/html/exit-status.html


1
Отже, вона доступна лише в bash shell?
daltonfury42

4
@ Daltonfury42 немає, будь-яка оболонка , яка намагається мати деяку сумісність з Bourne оболонки буде підтримувати його ( в тому числі dash, ksh, zsh, серед інших).
муру

2
csh та риба використовують $statusдля тих же цілей
glenn jackman

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.
kojiro

1
Чи є посилання від того часу, коли це використовується для снарядів? Цікаво, чи взяв Перл ті з сценаріїв снарядів.
simbabque

Це передує Perl десятиліттями (або принаймні роками). На багато синтаксису Perl вплинув синтаксис оболонки. (Перл народився в 1987 році, і багато цього синтаксису походить від оригінальної оболонки Борна (1977). Я не на 100%, коли $ _ було введено, але це було майже напевно до 1987 року.
Popup

6

$?є спеціальним параметром оболонки (змінної).

Взагалі всі змінні, визначені користувачем, повинні бути названі, використовуючи лише символи з класу символів, [:alnum:]тобто [a-zA-Z0-9_](також не можна починати з [0-9]).

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

Ви можете прочитати це, щоб отримати більше уявлення про змінні.


4

$?- це спеціальна змінна в bash, яка завжди містить код повернення / виходу останньої виконаної команди.

Ви можете переглянути його в терміналі, запустивши echo $?.

Зворотні коди знаходяться в діапазоні [0; 255].
Зворотний код 0зазвичай означає, що все нормально.
Інші значення вказують на помилки. Більшість програм повертають 1або користувацькі значення. Якщо команду не знайдено, змінна зазвичай містить127

Якщо ви хочете встановити цю змінну на певне значення, ви можете легко зробити це, bash -c "exit 5"щоб повернути, наприклад, код повернення 5.


Функція оболонки - це сумісний з POSIX спосіб встановлення статусу виходу без обов'язкового розгортання. setstatus() { return 5; }
якийro
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.