มีวิธีดำเนินการคำสั่งในไดเรกทอรีอื่นโดยไม่ต้องไปcd
หรือไม่ ฉันรู้ว่าฉันสามารถcd
เข้าcd
ออกได้ง่าย ๆ แต่ฉันแค่สนใจในความเป็นไปได้ที่จะเดินตามขั้นตอนพิเศษ :)
มีวิธีดำเนินการคำสั่งในไดเรกทอรีอื่นโดยไม่ต้องไปcd
หรือไม่ ฉันรู้ว่าฉันสามารถcd
เข้าcd
ออกได้ง่าย ๆ แต่ฉันแค่สนใจในความเป็นไปได้ที่จะเดินตามขั้นตอนพิเศษ :)
คำตอบ:
ฉันไม่รู้ว่าสิ่งนี้มีค่าหรือไม่ แต่คุณสามารถสร้าง subshell:
$ (cd /var/log && cp -- *.log ~/Desktop)
ไดเรคทอรีจะถูกเปลี่ยนสำหรับเชลล์ย่อยนั้นเท่านั้นดังนั้นคุณจึงไม่ต้องทำงานcd -
หลังจากนั้น
$ (cd /var/log && cp *.log ~/Desktop)
เพื่อหลีกเลี่ยงความวุ่นวายที่อาจเกิดขึ้นย่อยออกอัฒภาคกับสองเครื่องหมาย: ด้วยวิธีนี้หากไม่มีไดเร็กทอรีอยู่จะไม่มีการดำเนินการคำสั่งเพิ่มเติม
บางโปรแกรมมีตัวเลือกที่คุณสามารถบอกให้chdir (2)ตัวเอง (เช่น GNU tar ’ -C
/ --directory
)
นอกเหนือจากโปรแกรมดังกล่าว แต่สิ่งที่จะต้องchdir คุณสามารถเขียนและใช้โปรแกรม“ ไบนารี่” ที่คอมไพล์แทนการทำเชลล์ แต่มันอาจจะไม่ได้ประโยชน์มากนัก
ในความคิดเห็นในคำตอบอื่นคุณให้ตัวอย่าง:
execindirectory -d /var/log "cp *.log ~/Desktop"
เนื่องจาก*.log
รูปแบบถูกขยายโดยเชลล์เอง (ไม่ใช่cp ) บางสิ่งจะต้องchdirไปยังไดเร็กทอรีก่อนที่เชลล์จะประเมินคำสั่งของคุณ
หากคุณเพียงแค่สนใจในการหลีกเลี่ยง“ cd back” คุณสามารถใช้ subshell เพื่อแยกเอฟเฟกต์ของcdออกจากอินสแตนซ์ของเชลล์ที่ใช้งานได้
(cd /path/to/dir && some command)
คุณสามารถทำสิ่งนี้ได้ในฟังก์ชั่นเชลล์ (ฉันเลิกทำตัว-d
เลือกจากตัวอย่างการใช้งานของคุณเนื่องจากมีจุดเล็ก ๆ สำหรับคำสั่งนี้หากไดเรกทอรีเป็นตัวเลือกจริง ๆ )
runindir() { (cd "$1" && shift && eval "$@"); }
runindir /var/log 'cp *.log ~/Desktop' # your example
runindir /var/log cp \*.log \~/Desktop # eval takes multiple args
runindir /var/log cp \*.log ~/Desktop # it is okay to expand tilde first
ไม่บ่อนทำลายคุณค่าของคำตอบที่คนอื่นมอบให้ แต่ฉันเชื่อว่าสิ่งที่คุณต้องการคือ:
(cd /path/to && ./executable [ARGS])
หมายเหตุ parens เพื่อเรียกใช้cd
ใน sub-shell
นี่คือสิ่งที่ควรให้คุณcd
ย้อนกลับไปในที่ที่คุณอยู่ (ใช้ Bash) เนื่องจากไม่ลืมที่จะทำเช่นนั้นดูเหมือนจะเป็นจุดประสงค์ของคำถาม:
# Save where you are and cd to other dir
pushd /path/to/dir/that/needs/to/be/current/dir
run-your-command
# Get back where you were at the beginning.
popd
(แก้ไข: รุ่นที่สั้นกว่าเล็กน้อยด้วย @ Random832)
pushd other-dir
แทนที่จะเป็นpushd .; cd other-dir
น่าเศร้าตัวอย่างของคุณ:
execindirectory -d /var/log "cp *.log ~/Desktop"
ไม่ต้องการการเปลี่ยนแปลงกับ dir เพราะ
cp /var/log/*.log ~/Desktop
จะทำเช่นเดียวกัน คุณเข้าใกล้ปัญหาจริงของคุณไม่ได้หรือ เพราะเราอาจรู้จักทางออกที่ดีกว่าสำหรับเรื่องนั้นด้วย
วิธีที่ซับซ้อนในการแก้ปัญหาของคุณซึ่งอยู่ไกลจากความงดงามของโซลูชัน Michaels คือการใช้งานการค้นหาซึ่งมีสวิตช์ '-execdir' ที่จะดำเนินการใน dir ซึ่งเป็นไฟล์ที่พบ นำไปใช้กับตัวอย่างของคุณไม่ดี:
find /var/log -maxdepth 1 -type f -name "*.log" -execdir echo cp {} ~/Desktop ";"
อาจเป็นประโยชน์สำหรับปัญหาที่แท้จริงของคุณ -okdir แทน -execdir จะขอให้คุณยืนยันการร้องขอทุกครั้ง
-okdir และ -execdir อาจต้องติดตั้ง gnu-find ซึ่งโดยทั่วไปจะใช้กับ Linux
แล้วไง./your/path/command.sh
ล่ะ
execindirectory -d /var/log "cp *.log ~/Desktop"
ไม่จริงผมหมายถึงสิ่งที่ต้องการต่อไปนี้:
echo "#!/bin/bash; cd $1; exec $2" > /usr/local/bin/execindirectory; chmod +x /usr/local/bin/execindirectory
มันค่อนข้างน่ารำคาญที่จะทำให้สคริปต์ที่ไม่นี้: อาจต้องใช้ความพยายามอีกเล็กน้อยหากคุณต้องการให้รองรับ "แท็ก" ตัวเลือกเช่น-d
และเนื้อหา