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).

Karl Richter
sumber

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.

Michael Homer
sumber
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