อะไรคือข้อดีของการใช้ bash -c มากกว่าการใช้สตริงที่นี่?


11

มีประโยชน์จริง ๆ ที่จะใช้bash -c 'some command'มากกว่าการใช้bash <<< 'some command'

พวกเขาดูเหมือนจะบรรลุผลเช่นเดียวกัน



สวัสดี @ Patrick ขอบคุณสำหรับการแจ้งเตือน ฉันไม่แน่ใจจริงๆเกี่ยวกับสถานที่ที่ดีที่สุดในการโพสต์ ในอีกด้านหนึ่งนี่เป็นคำถามของ Linux แต่ในทางกลับกันการทุบตีเป็นภาษาสคริปต์ชนิดหนึ่งและไซต์อื่น ๆ มีผู้เข้าชมมากกว่า ในกรณีเช่นนี้สถานที่ที่เหมาะสมกว่าจะโพสต์ที่ไหน
yosefrow

4
@yosefrow: เว็บไซต์ใดเว็บไซต์หนึ่งอาจเป็น IMHO ที่ดี แต่ crossposting นั้นน่ารังเกียจ (คุณขอให้ผู้คนในทั้งสองไซต์ใช้เวลากับคำถามของคุณโดยไม่ให้ประโยชน์แก่คำตอบของกันและกัน)
ruakh

การลบโพสต์จากเว็บไซต์ใดไซต์หนึ่งเหมาะสมหรือไม่
yosefrow

2
ข้อแตกต่างเล็กน้อยอีกอย่างก็คือมันbash -c '...'จะทำงานในกระสุนที่ไม่มี herestrings คุณกำลังสมมติว่า bash จะถูกเรียกภายใน bash shell แต่จะไม่เป็นเช่นนั้นเสมอไป
Joel Cornett

คำตอบ:


21

bash -c 'some command'คงการเข้าถึงอินพุตมาตรฐานของผู้เรียกดังนั้นreadคำสั่งที่อ่านจากอินพุตมาตรฐานจะทำงานได้ตามปกติ bash <<< 'some command'แทนที่การป้อนข้อมูลที่มีเส้นที่ถูกส่งในดังนั้นbash -c catและbash <<< catทำสิ่งที่แตกต่างกัน

$ bash -c cat
abc
abc
^D
$ bash <<< cat
$

ในทางกลับกันคุณสามารถใช้คุณลักษณะนั้นเพื่อให้อินพุตมาตรฐานของคุณเองที่จะใช้$'...'หากคุณระมัดระวังอย่างมาก:

$ bash <<< $'read x y\nabc def ghi\necho $y'
def ghi
$

ฉันไม่ต้องการที่จะพึ่งพามัน แต่บางครั้งก็สะดวก


bash -cอนุญาตให้ส่งผ่านข้อโต้แย้งไปยังสคริปต์และ$0ตั้งค่า:

bash -c 'some command' sh abc def

จะตั้ง$1ไปabcและ$2จะอยู่ภายในdefsome command


3
ข้อผิดพลาดทางไวยากรณ์จะทำให้ข้อความที่แตกต่างกันเล็กน้อย ส่วนใหญ่แล้วbash -cคนที่พูดถึง-cAFAIK ไม่ไร้จุดหมายอย่างสิ้นเชิงเนื่องจากสามารถช่วยติดตามพวกเขาได้ bash <<< 'script'ข้อผิดพลาดจะมีลักษณะเหมือนในสคริปต์หลัก bash -c 'script'คนทำไม่ได้ bash -c 'script' labelคุณยังสามารถติดป้ายกำกับ:
Derobert

ก็bash <<< 'echo $1' /dev/stdin fooทำงานได้ดีและพิมพ์fooออกมา แม้ว่าการตั้งค่า$0จะค่อนข้าง จำกัด
ilkkachu

bash <<< 'echo "$1"' /dev/stdin fooไม่ได้ผลเสมอไป ฉันbash <<< 'echo "$1"' -s fooต้องทำงาน
G-Man กล่าวว่า 'Reinstate Monica'
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.