Xem các ví dụ sau và kết quả đầu ra của chúng trong shell POSIX:
false;echo $?
hoặcfalse || echo 1
:1
false;foo="bar";echo $?
hoặcfoo="bar" && echo 0
:0
foo=$(false);echo $?
hoặcfoo=$(false) || echo 1
:1
foo=$(true);echo $?
hoặcfoo=$(true) && echo 0
:0
Như được đề cập bởi câu trả lời được bình chọn cao nhất tại /programming/6834487/what-is-the-variable-in-shell-scripting :
$?
được sử dụng để tìm giá trị trả về của lệnh được thực thi cuối cùng.
Đây có thể là một chút sai lệch trong trường hợp này, vì vậy hãy lấy định nghĩa POSIX cũng được trích dẫn trong một bài đăng từ chủ đề đó:
? 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).
Vì vậy, nó xuất hiện như thể một nhiệm vụ tự nó được tính là một lệnh (hay đúng hơn là một phần đường ống) với giá trị thoát bằng 0 nhưng áp dụng trước phía bên phải của nhiệm vụ (ví dụ: lệnh thay thế lệnh gọi trong ví dụ của tôi ở đây).
Tôi thấy hành vi này có ý nghĩa như thế nào từ quan điểm thực tế nhưng đối với tôi, việc chuyển nhượng sẽ được tính theo thứ tự đó có vẻ hơi bất thường. Có lẽ để làm rõ hơn lý do tại sao nó lạ đối với tôi, hãy giả sử nhiệm vụ là một chức năng:
ASSIGNMENT( VARIABLE, VALUE )
sau đó foo="bar"
sẽ là
ASSIGNMENT( "foo", "bar" )
và foo=$(false)
sẽ là một cái gì đó như
ASSIGNMENT( "foo", EXECUTE( "false" ) )
điều đó có nghĩa là EXECUTE
chạy trước và chỉ sau đó mới ASSIGNMENT
được chạy nhưng nó vẫn là EXECUTE
trạng thái quan trọng ở đây.
Tôi có đúng trong đánh giá của tôi hay tôi hiểu sai / thiếu một cái gì đó? Đó có phải là những lý do đúng đắn để tôi xem hành vi này là "lạ"?
false;foo="bar";echo $?
luôn luôn trả về 0 khi lệnh thực sự cuối cùng đã chạy false
?" Về cơ bản, các bài tập hành xử đặc biệt khi nói đến mã thoát. Mã thoát của họ luôn là 0, trừ khi không phải vì mã nào đó chạy như một phần của phía bên phải của bài tập.