Bagaimana Anda menggunakan PIPESTATUS, tee dan / bin / sh secara bersamaan?

5

Ketika saya berlari

curl | tee test.txt; echo ${PIPESTATUS[0]}

Saya melihat dengan benar

curl: coba 'curl --help' atau 'curl --manual' untuk informasi lebih lanjut

2

Tetapi ketika saya mencoba menjalankan perintah yang persis sama menggunakan '/ bin / sh':

sh -c "curl | tee test.txt; echo \${PIPESTATUS[0]}"

saya mendapat

curl: coba 'curl --help' atau 'curl --manual' untuk informasi lebih lanjut

sh: 1: Substitusi buruk

Bagaimana kita bisa menyelesaikannya Bad substitution masalah, tolong?

Yasser Zamani
sumber
@jww, apakah mereka bekerja via sh -c "<your above link answer's scripts here>"?
Yasser Zamani

Jawaban:

5

Anda menyelesaikannya dengan tidak menggunakan sh.

Itu PIPESTATUS variabel khusus, dan ${var[idx]} array sintaksis secara umum, adalah fitur khusus untuk Bash shell. Mereka tidak ada di POSIX SH , dan bahkan mengupas itu melakukan memiliki array mungkin menggunakan sintaks yang berbeda.

Kebetulan beberapa distro Linux bersinkronisasi /bin/sh ke Bash. Namun, distribusi lain menghubungkannya dengan berlari , Debian Almquist Shell. Keduanya kompatibel dengan POSIX SH skrip, tetapi hanya Bash yang menerima ${PIPESTATUS[…]} sintaksis.

Jadi, jika Anda ingin menggunakannya, jalankan bash -c "…" sebagai gantinya.

grawity
sumber
Karena itu bagian dari pertanyaan untuk digunakan sh. Jawaban yang lebih baik di bawah, dengan retasan. Tapi bukan "solusi" yang lebih baik (saya akan setuju bahwa solusi yang lebih baik adalah menghindari sh )
Dr Beco
4

Workaound untuk '/ bin / sh' atau busybox

status=0
eval ` { ls /dontexists || echo status="$?"; } | tee /dev/null`
echo "# status=${status}"

Lacak:

busybox sh ~/bin/test.sh 
+ status=0
+ ls /dontexists
+ tee /dev/null
ls: /dontexists: No such file or directory
+ echo status=1
+ eval status=1
+ status=1
+ echo # status=1
# status=1
rzr
sumber
1

Juga 'bash -c' tampaknya memiliki masalah dengan itu ketika dipanggil dari tcsh:

bash -c "curl | tee test.txt; echo \${PIPESTATUS[0]}"

PIPESTATUS: Variabel tidak terdefinisi.

Ini bekerja untuk saya dari tcsh:

bash -c 'curl | tee test.txt; echo ${PIPESTATUS[0]}'

curl: coba 'curl --help' atau 'curl --manual' untuk informasi lebih lanjut
2

GNU bash, versi 4.2.25 (1) -release (x86_64-pc-linux-gnu)
dipanggil dari tcsh 6.17.06

atmchem
sumber