อะไรbash -เฉลี่ยในรหัสเปลือกทุบตีต่อไปนี้หรือไม่? ดูเหมือนว่าจะใช้ในการส่งออกรหัสสุดท้ายเป็นอินพุท ถ้าเป็นเช่นนั้นฉันจะเขียนมันเป็นbashหรือxargs bash?
curl --silent --location https://rpm.nodesource.com/setup | bash -อะไรbash -เฉลี่ยในรหัสเปลือกทุบตีต่อไปนี้หรือไม่? ดูเหมือนว่าจะใช้ในการส่งออกรหัสสุดท้ายเป็นอินพุท ถ้าเป็นเช่นนั้นฉันจะเขียนมันเป็นbashหรือxargs bash?
curl --silent --location https://rpm.nodesource.com/setup | bash -คำตอบ:
เมื่อสงสัยให้อ่านซอร์สโค้ด =)
Bash 4.3, shell.cline 830, ในฟังก์ชั่นparse_shell_options() :
  /* A single `-' signals the end of options.  From the 4.3 BSD sh.
     An option `--' means the same thing; this is the standard
     getopt(3) meaning. */
  if (arg_string[0] == '-' &&
       (arg_string[1] == '\0' ||
         (arg_string[1] == '-' && arg_string[2] == '\0')))
    return (next_arg);ในคำอื่น ๆ ที่-จะบอกว่ามีไม่มีตัวเลือกมากขึ้น ถ้ามีคำพูดใด ๆ -เพิ่มเติมในบรรทัดคำสั่งพวกเขาจะได้รับการปฏิบัติเป็นชื่อไฟล์แม้ว่าคำว่าเริ่มต้นด้วย
ในตัวอย่างของคุณแน่นอนว่า-มีการซ้ำซ้อนอย่างสมบูรณ์เนื่องจากไม่มีสิ่งใดติดตามอยู่ดี ในคำอื่น ๆเป็นสิ่งที่เทียบเท่ากับbash -bash
Bash ใช้คำสั่งของมัน
มันเป็นความเข้าใจผิดที่bash -บอกให้ Bash อ่านคำสั่งจากอินพุตมาตรฐาน ในขณะที่มันเป็นความจริงที่ว่าในตัวอย่างของคุณ, ทุบตีจะอ่านคำสั่งจาก stdin ก็จะได้ทำอย่างนั้นไม่ว่าจะมี-ในบรรทัดคำสั่งเพราะตามที่ระบุไว้ข้างต้นคือการเหมือนกันbash -bash
หากต้องการแสดงเพิ่มเติม-ว่าไม่ได้หมายความว่า stdin ให้พิจารณา:
catคำสั่งถูกออกแบบมาเพื่อตีความ-เป็น stdin ตัวอย่างเช่น:
$ echo xxx | cat /etc/hosts - /etc/shells
127.0.0.1 localhost
xxx
# /etc/shells: valid login shells
/bin/sh
/bin/dash
/bin/bash
/bin/rbash
/bin/zsh
/usr/bin/zsh
/usr/bin/screen
/bin/tcsh
/usr/bin/tcsh
/usr/bin/tmux
/bin/ksh93ในทางตรงกันข้ามคุณไม่สามารถได้รับการทุบตีในการดำเนินการ/bin/dateแล้ว/bin/hostnameโดยพยายามนี้:
$ echo date | bash - hostname
/bin/hostname: /bin/hostname: cannot execute binary fileค่อนข้างจะพยายามตีความ/bin/hostnameว่าเป็นไฟล์สคริปต์เชลล์ซึ่งล้มเหลวเนื่องจากเป็นไฟล์ไบนารีไบนารี
คุณไม่สามารถดำเนินการdate +%sโดยใช้bash -อย่างใดอย่างหนึ่ง
$ date +%s
1448696965
$ echo date | bash -
Sat Nov 28 07:49:31 UTC 2015
$ echo date | bash - +%s
bash: +%s: No such file or directoryคุณเขียนxargs bashแทนได้ไหม ไม่   curl | xargs bashต้องเรียกใช้ bash พร้อมเนื้อหาของสคริปต์เป็นอาร์กิวเมนต์บรรทัดคำสั่ง คำแรกของเนื้อหาจะเป็นอาร์กิวเมนต์แรกและอาจถูกตีความผิดว่าเป็นชื่อไฟล์สคริปต์
An argument of - is equivalent to --.
                    xargsแทนจะสามารถใช้งานได้ (ในสถานการณ์ที่ จำกัด ของสคริปต์อินพุตที่มีขนาดเล็ก) ด้วย| xargs bash -c; xargsแต่จริงๆนี้ไม่ได้ใช้ประโยชน์หรือสำนวนของ