Có, giá trị trả về ngầm định của hàm là trạng thái thoát của lệnh được thực thi cuối cùng . Điều đó cũng đúng ở bất kỳ điểm nào của bất kỳ tập lệnh shell nào. Tại bất kỳ điểm nào trong chuỗi thực thi tập lệnh, trạng thái thoát hiện tại là trạng thái thoát của lệnh cuối cùng được thực thi. Ngay cả lệnh được thực thi như là một phần của phép gán biến : var=$(exit 34)
. Sự khác biệt với các hàm là một hàm có thể thay đổi trạng thái thoát khi kết thúc thực thi hàm.
Cách khác để thay đổi "trạng thái thoát hiện tại" là bắt đầu một lớp vỏ phụ và thoát nó với bất kỳ trạng thái thoát cần thiết nào:
$ $(exit 34)
$ echo "$?"
34
Và có, việc mở rộng trạng thái thoát cần phải được trích dẫn:
$ IFS='123'
$ $(exit 34)
$ echo $?
4
A (exit 34)
cũng làm việc.
Một số người có thể lập luận rằng một cấu trúc mạnh mẽ hơn nên $(return 34)
và một lối thoát sẽ "thoát" tập lệnh đang được thực thi. Nhưng $(return 34)
không hoạt động với bất kỳ phiên bản bash nào. Vì vậy, nó không phải là di động.
Cách an toàn nhất để đặt trạng thái thoát là sử dụng nó vì nó được thiết kế để hoạt động, xác định và return
từ một chức năng:
exitstatus(){ return "${1:-"$?"}"; }
Vì vậy, vào cuối của một chức năng. nó chính xác tương đương với không có gì return
hoặc return "$?"
. Sự kết thúc của một hàm không cần có nghĩa là "dòng mã cuối cùng của hàm".
#!/bin/sh
exitstatus(){ a="${1:-"$?"}"; return "$a"; }
gmx(){
if [ "$1" = "one" ]; then
printf 'foo ';
exitstatus 78
return "$?"
elif [ "$1" = "two" ]; then
printf 'baz ';
exitstatus 89
return
else
printf 'baz ';
exitstatus 90
fi
}
Sẽ in:
$ ./script
foo 78
baz 89
baz 90
Cách sử dụng thực tế duy nhất "$?"
là in giá trị của nó: echo "$?"
hoặc lưu trữ nó trong một biến (vì nó là giá trị phù du và thay đổi với mỗi lệnh được thực thi): exitstatus=$?
(nhớ trích dẫn biến trong các lệnh như export EXITSTATUS="$?"
.
Trong return
lệnh, phạm vi giá trị hợp lệ thường là 0 đến 255, nhưng hãy hiểu rằng các giá trị 126 + n
được sử dụng bởi một số shell để báo hiệu trạng thái thoát đặc biệt, vì vậy, khuyến nghị chung là sử dụng 0-125.
return
là đối với các hàm được định nghĩa như thếf() (...; cmd; return)
, nó ngăn chặn việc tối ưu hóa mà một số shell thực hiệncmd
trong quá trình tương tự như lớp con. Với nhiều shell, điều đó cũng có nghĩa là trạng thái thoát của hàm không mang thông tincmd
đã bị giết khi có (hầu hết các shell không thể truy xuất thông tin đó bằng mọi cách).