Làm thế nào để bạn sử dụng PIPESTATUS, tee và / bin / sh cùng nhau?


6

Khi tôi chạy

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

Tôi thấy chính xác

curl: thử 'curl --help' hoặc 'curl --manual' để biết thêm thông tin

2

Nhưng khi tôi cố chạy chính xác cùng một lệnh bằng cách sử dụng '/ bin / sh':

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

tôi có

curl: thử 'curl --help' hoặc 'curl --manual' để biết thêm thông tin

sh: 1: Thay thế xấu

Làm thế nào chúng ta có thể giải quyết Bad substitutionvấn đề, xin vui lòng?



@jww, họ có làm việc qua sh -c "<your above link answer's scripts here>"không?
Yasser Zamani

Câu trả lời:


6

Bạn giải quyết nó bằng cách không sử dụng sh.

Các PIPESTATUSbiến đặc biệt, và các ${var[idx]} mảng cú pháp nói chung, là các tính năng cụ thể để vỏ Bash. Họ không tồn tại trong POSIX sh , và thậm chí cả vỏ mà làm có mảng có thể sử dụng một cú pháp khác nhau.

Nó chỉ xảy ra rằng một số bản phân phối Linux liên kết /bin/shvới Bash. Tuy nhiên, các bản phân phối khác liên kết nó với dấu gạch ngang , Debian Almquist Shell. Cả hai đều tương thích với các tập lệnh sh POSIX , nhưng chỉ Bash chấp nhận ${PIPESTATUS[…]}cú pháp.

Vì vậy, nếu bạn muốn sử dụng nó, hãy chạy bash -c "…"thay thế.


Bởi vì một phần của câu hỏi để sử dụng sh. Trả lời tốt hơn dưới đây, với một hack. Mặc dù vậy, không phải là một "giải pháp" tốt hơn (Tôi sẽ đồng ý rằng một giải pháp tốt hơn là nên tránh sh)
Tiến sĩ Beco

5

Cách xử lý cho '/ bin / sh' hoặc busybox

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

Dấu vết:

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

1

Ngoài ra, 'bash -c' dường như có vấn đề với nó khi được gọi từ tcsh:

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

PIPESTATUS: Biến không xác định.

Điều này làm việc cho tôi từ tcsh:

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

curl: thử 'curl --help' hoặc 'curl --manual' để biết thêm thông tin
2

GNU bash, phiên bản 4.2.25 (1) -release (x86_64-pc-linux-gnu)
được gọi từ tcsh 6.17.06


Đó là hành vi dự kiến: dấu ngoặc đơn không gây ra nội suy biến. Xem stackoverflow.com/questions/6697753/ trên
silviot
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.