ไพพ์สคริปต์ด้วย“ อ่าน” เพื่อทุบตี


10

ฉันต้องการเรียกใช้สคริปต์โดยการไพพ์สคริปต์ผ่านbashด้วยwget(แทนที่จะรันสคริปต์โดยตรงด้วยการทุบตี)

$ wget -O - http://example.com/my-script.sh | bash

มันไม่ทำงานเพราะสคริปต์ของฉันมีreadข้อความอยู่ ด้วยเหตุผลบางอย่างสิ่งเหล่านี้ใช้ไม่ได้เมื่อไปป์เพื่อทุบตี:

# Piping to bash works in general
$ echo 'hi'
hi
$ echo "echo 'hi'" | bash
hi

# `read` works directly
$ read -p "input: " var
input: <prompt>

# But not when piping - returns immediately
$ echo 'read -p "input: " var' | bash
$

แทนการกระตุ้นและขอค่าตามที่ควรอ่านคำสั่งเพียงแค่ได้รับการส่งผ่านโดยinput:bash

ไม่มีใครรู้ว่าฉันสามารถท่อสคริปต์ที่มีreadการbash?

คำตอบ:


16

readอ่านจากอินพุตมาตรฐาน แต่อินพุตมาตรฐานของกระบวนการทุบตีถูกใช้งานโดยสคริปต์ ทั้งนี้ขึ้นอยู่กับเชลล์คุณreadจะไม่อ่านอะไรเลยเพราะเชลล์อ่านแล้วและแยกวิเคราะห์สคริปต์ทั้งหมดหรือreadใช้บรรทัดที่ไม่สามารถคาดเดาได้ในสคริปต์

วิธีแก้ปัญหาง่าย ๆ :

bash -c "$(wget -O - http://example.com/my-script.sh)"

โซลูชันที่ซับซ้อนมากขึ้นเพื่อวัตถุประสงค์ด้านการศึกษามากกว่าเพื่อแสดงวิธีแก้ปัญหาที่ดีสำหรับสถานการณ์เฉพาะนี้:

echo '{ exec </dev/tty; wget -O - http://example.com/my-script.sh; }' | bash

ขอบคุณมาก นี่คือเกือบสง่างาม
Robin Winslow

2

การทดแทนกระบวนการจะทำสิ่งที่คุณต้องการ:

bash <(wget ...)

ที่กล่าวว่าฉันต้องถามแรงจูงใจของคุณที่นี่ หากคุณควบคุมเว็บเซิร์ฟเวอร์ (และใช้ https) อาจเป็นเรื่องที่สมเหตุสมผล แต่เพียงเรียกใช้สคริปต์จากคนตาบอดอินเทอร์เน็ตมีความเสี่ยงมาก


just running a script from the internet blind is very riskyใช่เรารู้ว่ามันมีความเสี่ยง แต่ผู้คนสามารถเลือกที่จะเชื่อถือสคริปต์จากองค์กรบางแห่ง ดูการอภิปรายในความคิดเห็นเกี่ยวกับคำตอบของ @ Xen2050
Robin Winslow

1

มีบางอย่างผิดปกติกับ:

wget -O tmpscript.sh http://example.com/my-script.sh
chmod +x tmpscript.sh
tmpscript.sh

?


เพราะฉันต้องสร้างไฟล์ ฉันหมายความว่ามันทำงานได้มันยุ่งเล็กน้อย
Robin Winslow

1
จริง แม้ว่าจะเป็นเหตุผลที่ดีในการใช้งาน/tmpแต่โปรแกรมจำนวนมากใช้ไฟล์ชั่วคราว ฉันจะลังเลที่จะเรียกใช้สคริปต์ที่ดาวน์โหลดมาทันทีโดยไม่ได้ดูก่อน ...
Xen2050

นั่นคือการโทรของคุณ มีโปรเจ็กต์มากมายที่นำเสนอหนึ่ง liners เช่นDocker , ohmyzshและอื่น ๆ ที่ฉันจำไม่ได้ตอนนี้ ในกรณีนี้เป็นสคริปต์การตั้งค่าที่ฉันต้องการเรียกใช้บนระบบใหม่จากที่เก็บของฉันเอง ฉันไม่ได้กังวลเกี่ยวกับเนื้อหาเท่าที่ฉันเขียน
Robin Winslow

3
ฉันกำลังคิดถึงคนอื่นที่ค้นหาคำถามนี้ (อาจเป็นผู้ใช้ใหม่โดยสิ้นเชิง) อาจไม่รู้อะไรเลย
Xen2050
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.