คุณจะใช้ PIPESTATUS, tee และ / bin / sh ร่วมกันได้อย่างไร


6

เมื่อฉันวิ่ง

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

ฉันเห็นอย่างถูกต้อง

curl: ลอง 'curl --help' หรือ 'curl - คู่มือ' สำหรับข้อมูลเพิ่มเติม

2

แต่เมื่อฉันพยายามเรียกใช้คำสั่งเดียวกันโดยใช้ '/ bin / sh':

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

ฉันเข้าใจ

curl: ลอง 'curl --help' หรือ 'curl - คู่มือ' สำหรับข้อมูลเพิ่มเติม

sh: 1: การเปลี่ยนตัวไม่ดี

เราจะแก้Bad substitutionปัญหาได้อย่างไร



@ jww พวกเขาทำงานผ่านsh -c "<your above link answer's scripts here>"หรือเปล่า
Yasser Zamani

คำตอบ:


6

shคุณแก้ได้ด้วยการไม่ได้ใช้

PIPESTATUSตัวแปรเฉพาะและ${var[idx]} อาร์เรย์ไวยากรณ์โดยทั่วไปเป็นคุณสมบัติเฉพาะกับเปลือกทุบตี พวกเขาไม่ได้อยู่ใน POSIX ดวลจุดโทษและแม้กระทั่งเปลือกหอยที่ทำมีอาร์เรย์อาจใช้ไวยากรณ์ที่แตกต่างกัน

มันเกิดขึ้นที่ลีนุกซ์บางรุ่นเชื่อมโยง/bin/shไปยัง Bash อย่างไรก็ตามดิสทริบิวชันอื่น ๆเชื่อมโยงไปยังDash Debian Almquist Shell ทั้งสองเข้ากันได้กับสคริปต์POSIX shแต่เฉพาะ Bash เท่านั้นที่รับ${PIPESTATUS[…]}ไวยากรณ์

ดังนั้นหากคุณต้องการใช้ให้เรียกใช้bash -c "…"แทน


shเพราะเป็นส่วนหนึ่งของคำถามที่จะใช้ คำตอบที่ดีกว่าร้องกับแฮ็ค ไม่ดีกว่า "การแก้ปัญหา" แม้ว่า (ฉันจะยอมรับว่าเป็นทางออกที่ดีคือการหลีกเลี่ยงsh)
ดร Beco

5

ทำงานกับ '/ bin / sh' หรือ busybox

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

ติดตาม:

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

นอกจากนี้ 'bash -c' ดูเหมือนจะมีปัญหากับมันเมื่อถูกเรียกจาก tcsh:

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

PIPESTATUS: ตัวแปรที่ไม่ได้กำหนด

สิ่งนี้ใช้ได้กับฉันจาก tcsh:

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

curl: ลอง 'curl --help' หรือ 'curl - คู่มือ' สำหรับข้อมูลเพิ่มเติม
2

GNU bash, รุ่น 4.2.25 (1) - ปล่อย (x86_64-pc-linux-gnu) ที่
เรียกจาก tcsh 6.17.06


นั่นเป็นพฤติกรรมที่คาดหวัง: คำพูดเดียวไม่ทำให้เกิดการแก้ไขตัวแปร ดูstackoverflow.com/questions/6697753/…
silviot
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.