อะไร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.c
line 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
แต่จริงๆนี้ไม่ได้ใช้ประโยชน์หรือสำนวนของ