Tại sao thoát với mã trả lại được lưu trữ của lệnh lồng nhau dẫn đến các mã trả lại khác nhau trong Dash và Bash?


8

Đang chạy

bash -c 'bash -c "echo test1; exit 1;" &> /tmp/x; buildresult=$?; tail -n 100 /tmp/x; exit $buildresult;'

kết quả test1là được in ra bàn điều khiển và echo $?in 1theo cách hiểu của tôi là chính xác, bởi vì lệnh sẽ trả về với nội dung được [b/d]ash -ctrả về trong khi

dash -c 'dash -c "echo test1; exit 1;" &> /tmp/x; buildresult=$?; tail -n 100 /tmp/x; exit $buildresult;'

kết quả trong cùng một đầu ra, nhưng trả về 0theo echo $?.

Tôi muốn hiểu sự khác biệt này để mở rộng hiểu biết của tôi về shell và lập trình shell di động.

Tôi đang sử dụng bash4.4.12 và dash0.5.8-2.3ubfox1 trên Ubuntu 17.10 (Artful Aardvark).

Câu trả lời:


20

&>không có trong POSIX và không được hỗ trợ bởi dash. Nó được phân tích cú pháp như là & >, vì vậy lệnh được thay thế. Các lệnh nền được đưa ra trạng thái thoát bằng 0 từ phối cảnh của cha mẹ, vì chúng không thoát ra khi bạn đọc $?.

Đó cũng là lý do tại sao (đối với tôi ít nhất), test1đầu ra "" xuất hiện trong lời nhắc của tôi, sau khi lệnh kết thúc.

Bash's &> footương đương với> foo 2>&1 , và một tập lệnh di động nên sử dụng tập lệnh sau.


5
&>là trong POSIX. Đó là &tiếp theo >. Trong foo &> barđó, đó là foo &để bắt đầu footrong nền và > barđể thực hiện chuyển hướng mà không cần lệnh. bashkhông tuân thủ POSIX khi nó diễn giải nó khác đi.
Stéphane Chazelas

4
Điều thú vị là điều này không được đề cập trong wiki.ubfox.com/DashAsBinSh Tôi đã tự do chỉnh sửa trang và bao gồm điều đó
Sergiy Kolodyazhnyy
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.