Bash สามารถรันคำสั่งในบริบทไดเร็กทอรีอื่นได้อย่างไร?


95

ฉันมีคำสั่งทั่วไปที่เรียกจากภายในไดเร็กทอรีเฉพาะ มีเพียงไฟล์ปฏิบัติการเดียวที่อยู่ใน / bin สำหรับโปรแกรมนี้และไดเร็กทอรีการทำงานปัจจุบันมีความสำคัญมากสำหรับการรันอย่างถูกต้อง สคริปต์มีผลต่อไฟล์ที่อยู่ภายในไดเร็กทอรีที่รันอยู่

ตอนนี้ฉันยังมีเชลล์สคริปต์แบบกำหนดเองที่ทำบางสิ่งในไดเร็กทอรีเดียว แต่ฉันต้องเรียกคำสั่งนั้นที่กล่าวถึงข้างต้นราวกับว่าอยู่ในไดเร็กทอรีอื่น

คุณทำสิ่งนี้ในเชลล์สคริปต์ได้อย่างไร


คำตอบ:


39

คุณสามารถใช้cdbuiltin หรือpushdและpopdbuiltins เพื่อวัตถุประสงค์นี้ ตัวอย่างเช่น:

# do something with /etc as the working directory
cd /etc
:

# do something with /tmp as the working directory
cd /tmp
:

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


4
นอกจากนี้ยังcd -มีเชลล์ POSIX เพื่อเปลี่ยนกลับไปยังไดเร็กทอรีก่อนหน้า ที่กล่าวว่า (a) pushdและpopdมีไว้สำหรับการใช้งานเชิงโต้ตอบและ (b) ไม่ปลอดภัยเสมอไปที่จะคิดว่าคุณสามารถcdกลับไปที่จุดเริ่มต้นได้โดยเฉพาะในระบบย่อยที่ซับซ้อนซึ่งอาจใช้สิทธิ์ที่ จำกัด ภายใน (ดูstackoverflow.com/questions/ 10555284 / … )
geekosaur

3
การใช้ subshell เป็นวิธีที่ดีกว่ามาก
josh123a123

สำหรับการเขียนสคริปต์เป็น subshell น่าจะเป็นความคิดที่ดี .. popdแต่ฉันมีความสุขจริงๆที่จะเรียนรู้เกี่ยวกับ
connorbode

คุณช่วยอธิบายความ:หมายของสัญลักษณ์ที่นี่ได้ไหม
Vadim Kotov

2
@VadimKotov ฉันคิดว่ามันไม่มีประสิทธิภาพ ส่วนที่เกี่ยวข้องของการman bashอ่าน: : [arguments]ไม่มีผล; คำสั่งไม่ทำอะไรเลยนอกจากขยายอาร์กิวเมนต์และดำเนินการเปลี่ยนเส้นทางที่ระบุ สถานะการส่งคืนเป็นศูนย์
boycy

220

ใช้cdใน subshell; วิธีชวเลขในการใช้ subshell ประเภทนี้คือวงเล็บ

(cd wherever; mycommand ...)

ที่กล่าวว่าหากคำสั่งของคุณมีสภาพแวดล้อมที่ต้องการก็ควรตรวจสอบให้แน่ใจว่าสภาพแวดล้อมนั้นเองแทนที่จะใส่ความรับผิดชอบลงในสิ่งที่อาจต้องการใช้ (เว้นแต่จะเป็นคำสั่งภายในที่ใช้ในสถานการณ์ที่เฉพาะเจาะจงมากในบริบทของหลุม กำหนดระบบที่ใหญ่ขึ้นซึ่งผู้โทรทุกคนจำเป็นต้องมั่นใจในสภาพแวดล้อมที่ต้องการ) โดยปกติแล้วจะเป็นกระดาษห่อเชลล์สคริปต์บางประเภท


คุณยังสามารถแทรก\หลัง;สำหรับคำสั่งหลายบรรทัดภายในบริบทเดียวกันได้
Chiramisu


20

หากคุณต้องการกลับไปที่ไดเร็กทอรีการทำงานปัจจุบันของคุณ:

current_dir=$PWD;cd /path/to/your/command/dir;special command ARGS;cd $current_dir;
  1. เรากำลังตั้งค่าตัวแปรcurrent_dirให้เท่ากับไฟล์pwd
  2. หลังจากนั้นเราจะไปcdที่ที่คุณต้องการเรียกใช้คำสั่งของคุณ
  3. จากนั้นเรากำลังเรียกใช้คำสั่ง
  4. จากนั้นเราจะcdกลับไปที่ตัวแปรของเราcurrent_dir

โซลูชันอื่นโดย @apieceofbart pushd && YOUR COMMAND && popd


4
หรือคุณสามารถทำได้pushd && YOUR COMMAND && pulld
apieceofbart

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