ฉันจะรัน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 -