ใช้ xargs เพื่อ cd ไปยังไดเรกทอรี


28

รู้สึกเหมือนคนงี่เง่าในขณะนี้ ทำไมสิ่งนี้ไม่ทำงาน

echo "/some/directory/path" | xargs -n1 cd

คำตอบ:


22

ไพพ์รัน xargs ในกระบวนการย่อยและ xargs รัน cd ในกระบวนการย่อย การเปลี่ยนแปลงในกระบวนการย่อยไม่ได้รับการเผยแพร่สู่กระบวนการหลัก


นั่นทำให้รู้สึกที่สมบูรณ์ ขอบคุณที่ช่วยยูนิกซ์ noob
Ian Lotinsky

3
คุณสามารถรับเอฟเฟกต์ที่คุณต้องการได้โดยใช้เครื่องหมายคำพูด: cd `echo "/some/directory/path" | cut -d\ -f1` (โปรดทราบว่าฉันเพิ่ม 'ตัด' เพื่อแยกช่องว่างและหยิบรายการแรกตามที่ xargs ทำ)
Slartibartfast

5
ที่จริงแล้วxargsไม่สามารถรันได้cdเพราะมันเป็นเชลล์ที่มีความจำเป็นและxargsสามารถเรียกใช้โปรแกรมปฏิบัติการแบบยืนได้เท่านั้น อย่างไรก็ตามสิ่งที่คุณพูดนั้นเป็นความจริงเกี่ยวกับกระบวนการย่อย
หยุดชั่วคราวจนกว่าจะมีการแจ้งให้ทราบต่อไป

/ usr / bin / cd เป็นคำสั่ง Unix free ที่มีเอกสารอย่างน้อยใน Solaris
jlliagre

การใช้ @Slartibartfast สำหรับเส้นทางที่สร้างขึ้นโดยอัตโนมัติ: cd `port file libcudd | sed -e 's/\/Portfile//'` (โดยปกติจะยาวมากซึ่งคุณไม่ต้องการจัดการด้วยตนเองเช่นตำแหน่ง MacPorts Portfile)
Ioannis Filippidis

23

คำสั่งcdเป็นบิวด์อินเนื่องจากข้อมูลเกี่ยวกับไดเร็กทอรีปัจจุบันเชื่อมโยงกับกระบวนการและมีเพียงเชลล์บิวด์อินเท่านั้นที่สามารถเปลี่ยนไดเร็กทอรีปัจจุบันของเชลล์ที่กำลังรัน

รหัสของคุณมีปัญหาสองประการ:

  1. xargsไม่สามารถเรียกใช้cdเพราะcdเป็นคำสั่งในตัวและxargsสามารถเรียกใช้ไฟล์ที่ปฏิบัติการได้เท่านั้น
  2. แม้ว่าคุณจะเรียกใช้cdในกระบวนการย่อยที่เรียกว่าxargsมันจะไม่มีผลใด ๆ กับกระบวนการหลักดังที่อธิบายไว้ข้างต้น

วิธีการแก้ปัญหาคือการเรียกใช้ sub-shell ภายในนั้นเรียกใช้cdแล้วคุณสามารถรันคำสั่งในไดเรกทอรีปัจจุบันใหม่

ls | xargs -L 1 bash -c 'cd "$0" && pwd && ls'

มันไม่มีเหตุผลที่จะทำls | xargs ...ในตัวอย่างนี้ มันควรจะผ่านคุณค่า$0เช่นecho "/some/directory/path" | xargs -L 1 bash -c 'cd "$0" && pwd && ls'
wisbucky

IMO ทางออกที่ดีกว่าน่าจะเป็น: ls | xargs -L 1 -I @@ bash -c 'cd @@ && pwd && ls'
Roman M
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.