ใช้“ cd -” โดยไม่มีเอาต์พุตใด ๆ


28

ฉันจะรันcd -คำสั่งโดยไม่แสดงเอาต์พุตใด ๆ ได้อย่างไร?
ฉันพยายามcd - 2>&1 /dev/nullแต่มันพิมพ์ไดเรกทอรีปลายทาง
เหตุผลของเรื่องนี้คือฉันต้องการใช้ฟังก์ชั่นทุบตีและฉันต้องการที่จะไม่ได้มีการส่งออกที่ไม่จำเป็น

คำตอบ:


32

ลองแบบนี้:

cd - > /dev/null

คุณยังสามารถทำสิ่งต่อไปนี้

cd - > uselessfile

สิ่งนี้จะส่งเอาต์พุตไปยังไฟล์ "uselessfile" แทนที่จะไปที่ STDOUT

นอกจากนี้คุณยังสามารถผนวกแทนการสร้างหรือเขียนทับไฟล์

cd - >> uselessfile

15

@erewok ได้ตอบคำถามไปแล้ว แต่ฉันจะอธิบายให้เข้าใจว่าเกิดอะไรขึ้นและทำไมคุณถึงเห็นพฤติกรรมที่คุณทำ

ปัญหาเกิดจากการเปลี่ยนเส้นทางของคุณ คุณกำลังเขียน:

cd - 2>&1 /dev/null

ซึ่งเนื่องจากการเปลี่ยนเส้นทางสามารถปรากฏที่ใดก็ได้ภายในบรรทัดคำสั่ง (คุณสามารถยืนยันด้วยตัวคุณเองด้วยสิ่งที่เรียบง่ายเช่นนี้echo a b 2>&1 c </etc/fstab d) หลังจากที่การเปลี่ยนเส้นทางถูกปล้นจะกลายเป็นจริง:

cd - /dev/null

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

สิ่งที่คุณตั้งใจจะเขียนคือcdคำสั่งที่มีการเปลี่ยนเส้นทางของทั้ง stderr และ stdout เป็น / dev / null มีสองวิธีในการทำเช่นนั้น

วิธีที่ง่ายที่สุดในกรณีของคุณคือเพียงแค่แจ้งเชลล์ว่าคุณต้องการเปลี่ยนเส้นทางโดยการเพิ่ม>อักขระ นี่คือสิ่งที่ @erewok แนะนำ

cd - 2>&1 >/dev/null

นี่เป็นครั้งแรกที่เปลี่ยนเส้นทาง stderr (file descriptor 2) ไปที่ file descriptor 1 (stdout) จากนั้นเปลี่ยนเส้นทาง stdout (โดยนัย 1) ไปที่ / dev / null โปรดทราบว่าการสั่งซื้อมีความสำคัญ คุณจะไม่ได้รับผลลัพธ์ที่เหมือนกันหากคุณย้อนกลับการเปลี่ยนเส้นทาง แต่ในบางกรณีอาจปรากฏว่าคุณทำเพราะวิธีที่โปรแกรมเฉพาะใช้กระแสข้อมูลขาออกที่เกี่ยวข้อง

หรือตามที่ได้รับการแนะนำโดย@demureคุณสามารถใช้&>เพื่อเปลี่ยนเส้นทางสตรีมทั้งสองพร้อมกันหากเชลล์ของคุณรองรับไวยากรณ์นี้

cd - &>/dev/null

โปรดทราบว่าตัวเลือกใด ๆ เหล่านี้จะเงียบข้อผิดพลาดเมื่อ$OLDPWDไม่มีอยู่อีกต่อไปเนื่องจากคุณเปลี่ยนเส้นทางข้อผิดพลาดมาตรฐานไปยังหลุมดำของระบบ หากนี่เป็นข้อกังวลฉันจะตรวจสอบ$?ภายหลัง คุณควรยืนยันเรื่องนี้ด้วยตัวเองถ้ามันเป็นความกังวลจริง แต่อย่างน้อยในการทดสอบของฉันล้มเหลวcd(ไม่ว่าcd $someplaceหรือcd -) ชุดขณะที่หลังจากประสบความสำเร็จ$? = 1$? = 0


5

บางทีคุณสามารถใช้

cd $OLDPWD

แต่ในกรณีนี้คุณจะต้องพิมพ์เพิ่มเติม :)

แต่คุณจะได้เปรียบ: หากมีข้อผิดพลาดข้อความจะไม่เปลี่ยนเส้นทางไปยัง / dev / null


1
หากไม่มีการตั้งค่านี้จะวางคุณใน$OLDPWD จะพิมพ์ข้อผิดพลาด (และอาจทำให้คุณอยู่ในที่ที่คุณอยู่) ~cd -
CVn

1
คุณไม่ถูกต้อง หาก $ OLDPWD ไม่มีการตั้งค่า (เพราะเหตุใดผู้ใช้จึงสามารถยกเลิกการตั้งค่านี้ได้) 'cd -' จะมีผลลัพธ์เหมือนกับ "cd $ OLDPWD" ตรวจสอบหน้าคู่มือ ('cd -' เทียบเท่า 'cd "$ OLDPWD" && pwd') หรือคุณสามารถทดสอบได้ :) 'OLDPWD = ""; cd - '- ดูสิว่าคุณจะใส่ ~ และพิมพ์อักขระ ~
uzsolt

1
ฉันเพิ่งทดสอบมัน ในระบบของฉันลำดับcd /tmp bash cd -พูดbash: cd: OLDPWD not setที่ cd ที่สอง; ในขณะที่ลำดับนำcd /tmp bash cd $OLDPWDคุณเข้าสู่ ~ (เกือบจะแน่นอนเพราะ $ OLDPWD ขยายเป็นสตริงว่าง) cd $OLDPWDจะทำงานได้ดีเมื่อคุณทำอย่างน้อยหนึ่งอย่างcdในเชลล์ที่มีปัญหา แต่ไม่ใช่ก่อนหน้านั้น
CVn

หืมใช่คุณพูดถูก ฉันทดสอบด้วย zsh และ zsh ไม่ได้แสดงข้อความผิดพลาด
uzsolt

1

เปลี่ยนเส้นทาง stdout และ stderr: cd - &>/dev/null

&>เป็นรุ่นมือสั้น ๆcd - 2>/dev/null 1>&2ซึ่งผมสิ่งที่ผมคิดว่าคุณหมายถึงการใช้ ...

  • Note &>ต้องการ bash> = 4.0

ps คำสั่งส่วนใหญ่สามารถชี้ไปที่ตำแหน่งต่างๆได้ดังนั้นจึงไม่จำเป็นต้องใช้cd


0

คุณสามารถใช้ได้:

cd ~-

ตามหน้าคนทุบตีภายใต้Tilde Expansion:

หากคำนำหน้าตัวหนอนเป็น `~ - 'ค่าของตัวแปรเชลล์ OLDPWD หากมีการตั้งค่าจะถูกแทนที่

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