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.