Là đô la? Biến (dấu hỏi-đô la) chỉ có sẵn trong vỏ Bash?


10

Trong Bashshell, tôi có thể nhận trạng thái thoát lệnh thông qua $?biến:

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

Có phải nó chỉ có sẵn trong vỏ Bash? Hoặc tôi cũng có thể sử dụng nó trong vỏ khác?


8
Bạn có thể sử dụng nó trong bất kỳ vỏ POSIX nào, đó là một trong những thông số đặc biệt
cuonglm

Câu trả lời:


19

$?thoát là phổ biến cho bất kỳ shell nào theo POSIX và được mô tả trong 2.5.2 Thông số đặc biệt :

?
Mở rộng đến trạng thái thoát thập phân của đường ống gần đây nhất (xem Đường ống ).


5
Không chỉ vỏ POSIX, tất cả các vỏ giống như Bourne bao gồm cả vỏ Bourne (mà tôi tin là vỏ giới thiệu, vỏ Mashey có nó như $rtôi tin). Vì vậy, đó là sh của hầu hết tất cả các hệ thống giống Unix kể từ Unix V7 vào cuối những năm 70, Hầu hết các hệ vỏ khác (csh, tcsh, fish, rc) đều có nó $status.
Stéphane Chazelas

2
Và nhiều ngôn ngữ kịch bản: Perl, Ruby, v.v.
OrangeDog

13

Như Thomas Dickey đã nói, bất kỳ vỏ POSIX nào (tức là khá nhiều trong số chúng) sẽ có $?.

Câu hỏi này khiến tôi quan tâm khá nhiều, vì vậy tôi đã thử nó trên bất kỳ vỏ nào tôi có thể chạm tay vào:

  • mksh
  • zsh
  • /bin/sh trên Samsung Galaxy S5 của tôi
  • /bin/sh trên bộ định tuyến của tôi
  • tcsh
  • ksh
  • dash
  • /bin/sh trên hệ thống UNIX ảo V của tôi từ năm 1989 trở đi
  • cmd.exepowershell.exetrên máy tính Windows 10 của tôi

$?làm việc trong tất cả những điều này nhưng fishcmd.exe.

Tìm thấy hai điều thú vị:

1. $?hoạt động trong Windows PowerShell!

Vâng, đến một điểm. Thay vì trả về 0 hoặc số cao hơn, nó chỉ TrueFalse.

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. $?không hoạt động trong vỏ fish.

Tuy nhiên, khi bạn gõ $?cá, bạn nhận được thông báo này:

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

Tôi đã không sử dụng nó nhiều nhưng tôi không ngạc nhiên, fishdường như có ngôn ngữ vỏ thú vị của riêng nó, hoàn toàn khác biệt bashhoặc bất cứ điều gì.


Hầu hết các shell (cá, csh, tcsh, rc, zsh) sử dụng $statusIMO đơn giản / dễ đọc hơn rất nhiều. Chỉ các shell giống Bourne (trong số các shell Unix) sử dụng $?AFAIK.
Stéphane Chazelas

3
Chỉ phụ thuộc vào cách bạn đang đọc. Tôi đọc tinh thần $?là "sh ## đã xảy ra?" và sau đó, tôi không bao giờ quên ý nghĩa của biến đặc biệt này :)

2
@nwildner lol! Tôi nghĩ rằng tôi sẽ không bao giờ quên điều đó ngay bây giờ!
hanetzer
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.