"$?" Змінна (знак долара) питання доступна лише в оболонці Bash?


10

У Bashоболонці я можу отримати статус виходу команди через $?змінну:

# ps -ef | grep "haha"
root     15439 15345  0 23:02 pts/0    00:00:00 grep --color=auto haha
# echo $?
0

Він доступний лише в оболонці Bash? Або я можу використовувати його і в інших оболонках?


8
Ви можете використовувати його в будь-якій оболонці POSIX, це один із спеціальних параметрів
cuonglm

Відповіді:


19

Код $?виходу є загальним для будь-якої оболонки, яка слідує за POSIX, і описаний у 2.5.2 Спеціальних параметрах :

?
Розширюється до десяткового статусу виходу останнього трубопроводу (див. Трубопроводи ).


5
Не тільки оболонка POSIX, всі оболонки, подібні до Борна, включаючи оболонку Борна (яка, на мою думку, була такою, що її вводила, оболонка Маші мала її, як $rя вважаю). Тож це практично всі системи, схожі на Unix, оскільки Unix V7 наприкінці 70-х років, більшість інших оболонок (csh, tcsh, fish, rc) мають його як $status.
Стефан Шазелас

2
І багато мов сценаріїв: Perl, Ruby тощо
OrangeDog

13

Як сказав Томас Дікі, будь-яка оболонка POSIX (тобто майже всі вони) матиме $?.

Це питання мене трохи зацікавило, тому я перевірив його на будь-якій оболонці, на яку я міг би отримати свої руки:

  • mksh
  • zsh
  • /bin/sh на моєму Samsung Galaxy S5
  • /bin/sh на моєму маршрутизаторі
  • tcsh
  • ksh
  • dash
  • /bin/sh на моїй віртуальній системі UNIX V від 1989 року
  • cmd.exeі powershell.exeна моєму комп'ютері Windows 10

і $?працював у всіх цих, але fishі cmd.exe.

Знайшли дві цікаві речі:

1. $?працює в Windows PowerShell!

Ну, до певного моменту. Замість того, щоб повернути 0 або більше число, це просто Trueі False.

PS C:\WINDOWS\system32> echo $?
True
PS C:\WINDOWS\system32> gfdhgfhfdgfdg
gfdhgfhfdgfdg : The term 'gfdhgfhfdgfdg' is not recognized as the name of a cmdlet, ...(big long error output).....
PS C:\WINDOWS\system32> echo $?
False

2. $?не працює в оболонці fish.

Однак, набираючи $?рибу, ви отримуєте це повідомлення:

~$ echo $?
$? is not the exit status. In fish, please use $status.
fish: echo $?

Я не дуже його використовував, але я не здивований, fishздається, має свою цікаву мову оболонки, зовсім іншу від bashбудь-якої іншої .


Більшість снарядів (риба, csh, tcsh, rc, zsh) використовують $statusнабагато простіший / розбірливіший ІМО. Лише снаряди, подібні до Борна (серед оболонок Unix), використовують $?AFAIK.
Стефан Шазелас

3
Просто залежить від того, як ви читаєте. Я подумки читав, $?як "sh ## сталося?" і після цього я ніколи не забував значення цієї спеціальної змінної :)

2
@nwildner lol! Я думаю, що я ніколи цього не забуду!
hanetzer
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.