ใช้ `` 'กับซีดีเท่านั้นหรือไม่


45

cd - สามารถสลับระหว่าง dir ปัจจุบันและ dir ก่อนหน้า

มันดูเหมือนว่าผมเคยเห็น-มาใช้เป็นข้อโต้แย้งคำสั่งอื่น ๆ ก่อน แต่ผมจำไม่ได้ว่าถ้าวิธีการเช่นเดียวกับกับ-cd

ฉันพบว่าไม่ได้ทำงานกับ-ls

คือ- ใช้เฉพาะกับ cd?


8
สิ่งที่ต้องจำไว้ก็cdคือตัวบิวอินไม่ใช่คำสั่งจากภายนอก (หรือจะไม่มีวิธีการทำงานแบบเดียวกัน) cd -จึงเป็นคุณสมบัติระดับเปลือก
ปุย

6
ฉันใช้ตลอดเวลาgit checkout -เพื่อสลับไปยังสาขาก่อนหน้า
wim

@fluffy: -มีการใช้ร่วมกับ builtins อื่น ๆ ด้วยวิธีเดียวกันหรือไม่
ทิม

สำหรับ buildins การจัดการไดเร็กทอรีบางตัวเช่นpushdใช่ มิฉะนั้นความหมายของ "ไดเรกทอรีก่อนหน้า" ไม่ได้เป็นค่าเริ่มต้นที่มีประโยชน์มาก
ปุย

1
บางทีคุณอาจนึกถึงคุณลักษณะ '~ -' ของ bash (ซึ่งตีความว่าเป็น $ OLDPWD) ที่สามารถใช้กับ 'ls' ในลักษณะที่คุณอธิบาย
abonet

คำตอบ:


22

POSIX แนวทางไวยากรณ์ยูทิลิตี้ (เฉพาะ # 13) ระบุว่าสำหรับสาธารณูปโภคที่คาดว่าชื่อไฟล์เพื่ออ่านจาก-วิธีการป้อนข้อมูลมาตรฐานและระบบสาธารณูปโภคที่คาดว่าชื่อไฟล์ที่จะเขียนถึง-วิธีการออกมาตรฐาน ตัวอย่างเช่นcat somefile -คัดลอกเนื้อหาของsomefileไปยังเอาต์พุตมาตรฐานตามด้วยสิ่งที่อ่านบนอินพุตมาตรฐาน

คำแนะนำนี้ใช้ไม่ได้กับcdคำสั่งเนื่องจากไม่ได้อ่านหรือเขียนไฟล์ cdทำสิ่งที่แตกต่าง: อาร์กิวเมนต์-หมายถึง "ไดเรกทอรีก่อนหน้า" คำสั่งเทียบเท่ากับcd - cd "$OLDPWD" && pwdลักษณะการทำงานนี้เป็นเฉพาะกับคำสั่งและคำสั่งที่เป็นแรงบันดาลใจโดยตรงเช่นcdpushd

โปรดทราบว่า-เป็นตัวถูกดำเนินการไม่ใช่ตัวเลือก เฉพาะอาร์กิวเมนต์ที่ขึ้นต้นด้วย-และไม่ได้เป็นเพียงแค่-หรือ--เป็นตัวเลือก ความหมายหลักของการเป็นตัวถูกดำเนินการคือ--ไม่มีผลต่อความหมายพิเศษ ยกตัวอย่างเช่นcd -- -Pการเปลี่ยนแปลงไปยังไดเรกทอรีย่อยที่เรียกว่า-Pแต่cd -- -เป็นเช่นเดียวกับมันไม่ได้เปลี่ยนไดเรกทอรีที่เรียกว่าcd - -ในทำนองเดียวกันcat -- -ไม่ได้อ่านจากไฟล์ที่เรียกว่า-แต่มาจากอินพุตมาตรฐาน


46

-ถูกกำหนดในPOSIX Utility Syntax Guidelinesเป็นอินพุตมาตรฐาน:

Guideline 13:
For utilities that use operands to represent files to be opened for either 
reading or writing, the '-' operand should be used to mean only standard input 
(or standard output when it is clear from context that an output file is being 
specified) or a file named -.

คุณสามารถดูคำจำกัดความนี้สำหรับยูทิลิตี้ที่ทำงานกับไฟล์สำหรับการอ่านหรือการเขียน cdไม่ได้เป็นของยูทิลิตี้เหล่านี้ดังนั้น-ใน cd ไม่เป็นไปตามแนวทางนี้

นอกจากนี้ POSIX ยังกำหนด-ความหมายของตัวเองด้วยcd :

-
    When a <hyphen> is used as the operand, this shall be equivalent to the 
    command:

    cd "$OLDPWD" && pwd

    which changes to the previous working directory and then writes its name.

36

cd -เป็นชวเลขจริงcd "$OLDPWD" && pwdซึ่ง$OLDPWDจะมีการตั้งค่าทุกครั้งที่คุณเปลี่ยนไดเรกทอรีเป็นไดเรกทอรีที่คุณเพิ่งเข้าไป

การจัดการ-ขึ้นอยู่กับแอปพลิเคชัน บางโปรแกรมใช้งาน-ที่มีความหมายSTDINเช่นgrep,awk

โปรแกรมอื่น ๆ อาจจะใช้-เป็นชวเลขสำหรับสิ่งที่พวกเขาเลือกที่เป็นคำตอบของไมเคิลระบุด้วยsu, -เป็นชวเลข--login


ใช่แน่นอนว่าไม่มีกฎ
กีวี

2
@ กีวี่: ด้วย POSIX มีกฎสำหรับสิ่งนั้นดูคำตอบของฉัน
cuonglm

เพื่อความแม่นยำมีกฎทั่วไป แต่มีข้อยกเว้นมากมาย นอกจากนี้ยังมีคำสั่งมากมายที่ทำให้กฎล่วงหน้าหรือการใช้งานแบบเก่าที่ไม่ได้รับการปรับปรุงเพื่อให้สอดคล้องกับกฎ
Barmar

19

แม้ว่าไมเคิลกล่าวว่าsuและการใช้งานอื่น ๆ สามารถใช้-เพื่อหมายถึงสิ่งที่พวกเขาต้องการ (อ่านจาก stdin เป็นเรื่องธรรมดา) Git ไม่ใช้งาน-ในลักษณะคล้ายกับวิธีการที่cdไม่สำหรับการเปลี่ยนสาขา

$ git status
On branch master

$ git checkout foobar
$ git status
On branch foobar

$ git checkout -
$ git status
On branch master

18

โปรแกรมใด ๆ สามารถใช้-เป็นอาร์กิวเมนต์เพื่อหมายถึงสิ่งที่พวกเขาต้องการ ตัวอย่างหนึ่งที่พบบ่อยคือsuซึ่งใช้เป็นชวเลข- --loginสิ่งเดียวที่ฉันนึกถึงคือโปรแกรมที่อ่านจากไฟล์ที่ใช้บ่อย-หมายถึง"read from stdin"แต่มันขึ้นอยู่กับโปรแกรมทั้งหมด


มีแบบแผนมาตรฐานหรือแบบมาตรฐานสำหรับการใช้สัญลักษณ์พิเศษเป็นข้อโต้แย้ง?
ทิม

2

เพิ่มสองเซ็นต์ของฉันที่นี่ ฉันใช้ '-' เพื่อบอกเครื่องมือ ps2pdf ให้อ่านจากอินพุตมาตรฐานเนื่องจากมีหลายคนแนะนำไว้ก่อนหน้านี้:

man -t ls | ps2pdf - ls.pdf

ซับในด้านบนจะสร้าง man page เวอร์ชัน pdf สำหรับlsในไดเรกทอรีปัจจุบัน
หวังว่าใครบางคนพบว่ามันมีประโยชน์ :)


2

ในฐานะที่เป็นคำตอบโดยgnouc , มีความหมายในตัวของมันเอง-cd

แต่คุณสามารถทำซ้ำลักษณะการทำงานของ-โปรแกรมอื่น ๆ ~-ที่ใช้ ตัวอย่างเช่น:

cd /etc
cd /
ls ~-             #lists the contents of the /etc directory
vim ~-/fstab      #opens the file /etc/fstab in vim
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.