Mengapa keluar dengan kode pengembalian yang tersimpan dari perintah bersarang menghasilkan kode-kode pengembalian yang berbeda di Dash dan Bash?


8

Lari

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

hasil test1yang dicetak untuk menghibur dan echo $?untuk mencetak 1yang menurut saya benar, karena perintah harus kembali dengan apa yang [b/d]ash -cdikembalikan dalam batin

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

menghasilkan output yang sama, tetapi kembali dengan 0menurut echo $?.

Saya ingin memahami perbedaan ini untuk memperluas pemahaman saya tentang shell dan pemrograman shell portabel.

Saya menggunakan bash4.4.12 dan dash0.5.8-2.3ubuntu1 di Ubuntu 17.10 (Artful Aardvark).

Jawaban:


20

&>tidak dalam POSIX dan tidak didukung oleh dash. Ini diuraikan sebagai & >, jadi perintahnya adalah latar belakang. Perintah berlatar belakang diberi status keluar nol dari perspektif induk, karena mereka belum keluar pada saat Anda membaca $ ?.

Itu juga mengapa (paling tidak bagi saya) " test1" output muncul di prompt saya, setelah perintah selesai.

Bash &> foosetara dengan> foo 2>&1 , dan skrip portabel harus menggunakan yang terakhir.


5
&>ada dalam POSIX. Itu &diikuti oleh >. Di foo &> bar, itu foo &dimulai foodi latar belakang dan > baruntuk melakukan pengalihan tanpa perintah. bashtidak sesuai dengan POSIX ketika menerjemahkannya secara berbeda.
Stéphane Chazelas

4
Yang cukup menarik adalah bahwa ini tidak disebutkan di wiki.ubuntu.com/DashAsBinSh Saya mengambil kebebasan untuk mengedit halaman dan memasukkannya
Sergiy Kolodyazhnyy
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.