ฉันจะรันcd -
คำสั่งโดยไม่แสดงเอาต์พุตใด ๆ ได้อย่างไร?
ฉันพยายามcd - 2>&1 /dev/null
แต่มันพิมพ์ไดเรกทอรีปลายทาง
เหตุผลของเรื่องนี้คือฉันต้องการใช้ฟังก์ชั่นทุบตีและฉันต้องการที่จะไม่ได้มีการส่งออกที่ไม่จำเป็น
ฉันจะรันcd -
คำสั่งโดยไม่แสดงเอาต์พุตใด ๆ ได้อย่างไร?
ฉันพยายามcd - 2>&1 /dev/null
แต่มันพิมพ์ไดเรกทอรีปลายทาง
เหตุผลของเรื่องนี้คือฉันต้องการใช้ฟังก์ชั่นทุบตีและฉันต้องการที่จะไม่ได้มีการส่งออกที่ไม่จำเป็น
คำตอบ:
ลองแบบนี้:
cd - > /dev/null
คุณยังสามารถทำสิ่งต่อไปนี้
cd - > uselessfile
สิ่งนี้จะส่งเอาต์พุตไปยังไฟล์ "uselessfile" แทนที่จะไปที่ STDOUT
นอกจากนี้คุณยังสามารถผนวกแทนการสร้างหรือเขียนทับไฟล์
cd - >> uselessfile
@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
บางทีคุณสามารถใช้
cd $OLDPWD
แต่ในกรณีนี้คุณจะต้องพิมพ์เพิ่มเติม :)
แต่คุณจะได้เปรียบ: หากมีข้อผิดพลาดข้อความจะไม่เปลี่ยนเส้นทางไปยัง / dev / null
cd /tmp
bash
cd -
พูดbash: cd: OLDPWD not set
ที่ cd ที่สอง; ในขณะที่ลำดับนำcd /tmp
bash
cd $OLDPWD
คุณเข้าสู่ ~ (เกือบจะแน่นอนเพราะ $ OLDPWD ขยายเป็นสตริงว่าง) cd $OLDPWD
จะทำงานได้ดีเมื่อคุณทำอย่างน้อยหนึ่งอย่างcd
ในเชลล์ที่มีปัญหา แต่ไม่ใช่ก่อนหน้านั้น
เปลี่ยนเส้นทาง stdout และ stderr:
cd - &>/dev/null
&>
เป็นรุ่นมือสั้น ๆcd - 2>/dev/null 1>&2
ซึ่งผมสิ่งที่ผมคิดว่าคุณหมายถึงการใช้ ...
&>
ต้องการ bash> = 4.0ps คำสั่งส่วนใหญ่สามารถชี้ไปที่ตำแหน่งต่างๆได้ดังนั้นจึงไม่จำเป็นต้องใช้cd
คุณสามารถใช้ได้:
cd ~-
ตามหน้าคนทุบตีภายใต้Tilde Expansion
:
หากคำนำหน้าตัวหนอนเป็น `~ - 'ค่าของตัวแปรเชลล์ OLDPWD หากมีการตั้งค่าจะถูกแทนที่
$OLDPWD
จะพิมพ์ข้อผิดพลาด (และอาจทำให้คุณอยู่ในที่ที่คุณอยู่)~
cd -