“ -” (ขีดกลางสองครั้ง) หมายความว่าอะไรในคำสั่งเชลล์นี้


14

ฉันมีคำสั่งเชลล์นี้:

kill `cat -- $PIDFILE`

สิ่งที่สอง - ทำที่นี่ ทำไมไม่ใช้เพียง

kill `cat $PIDFILE`

คำตอบ:


21

การ--บอกcatไม่ลองแยกวิเคราะห์สิ่งที่เกิดขึ้นหลังจากนั้นเป็นตัวเลือกบรรทัดคำสั่ง

เป็นตัวอย่างที่คิดว่าสิ่งที่จะเกิดขึ้นในสองกรณีถ้าตัวแปรถูกกำหนดเป็น$PIDFILE PIDFILE="--version"บนเครื่องของฉันพวกเขาให้ผลลัพธ์ต่อไปนี้:

$ cat $PIDFILE
cat (GNU coreutils) 6.10
Copyright (C) 2008 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

Written by Torbjorn Granlund and Richard M. Stallman.

$ cat -- $PIDFILE
cat: --version: No such file or directory

3
เป็นที่น่าสังเกตว่าพฤติกรรมนี้ (ในขณะที่พบบ่อยมาก) ถูกกำหนดโดยโปรแกรมรับ (เช่นcat) และไม่ใช่โดยเชลล์
dmckee --- ผู้ดูแลอดีตลูกแมว

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

3
@CMCDragonkai คุณไม่จำเป็นต้องดูเพิ่มเติมใด ๆ นอกเหนือจากgetopt(1)man page : "แต่ละพารามิเตอร์หลังพารามิเตอร์ '-' ถูกตีความว่าเป็นพารามิเตอร์ที่ไม่ใช่ตัวเลือกเสมอ"
Mikael Auno

1

POSIX.1-2017

POSIXยังระบุได้ที่: http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap12.html#tag_12_02

12.2 แนวทางไวยากรณ์ของยูทิลิตี้

หลักเกณฑ์ 10:

ครั้งแรก-ข้อโต้แย้งที่ไม่ได้เป็นตัวเลือกอาร์กิวเมนต์ควรได้รับการยอมรับว่าเป็นตัวคั่นที่ระบุในตอนท้ายของตัวเลือก อาร์กิวเมนต์ใด ๆ ต่อไปนี้ควรถือเป็นตัวถูกดำเนินการแม้ว่าจะเริ่มต้นด้วยอักขระ '-'

ดูเพิ่มเติมที่: /unix/11376/what-does-double-dash-mean-also-known-as-bare-double-dash

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