ฉันจะเรียกใช้คำสั่งในโฟลเดอร์โดยไม่เปลี่ยนไดเรกทอรีปัจจุบันของฉันเป็นอย่างไร


18

อาจดูเหมือนว่าแปลกสำหรับคุณ แต่ฉันต้องการเรียกใช้คำสั่งในโฟลเดอร์เฉพาะโดยไม่ต้องเปลี่ยนโฟลเดอร์ปัจจุบันในเชลล์ ตัวอย่าง - นี่คือสิ่งที่ฉันมักจะทำ:

~$ cd .folder
~/.folder$ command --key
~/.folder$ cd ..
~$ another_command --key

แม้ว่าฉันต้องการสิ่งนี้:

~$ .folder command --key
~$ another_command --key

เป็นไปได้ไหม?


ทำ~/.folder/command --keyไม่ได้เหรอ ที่ไม่commandจำเป็นต้องมีไดเรกทอรีปัจจุบันของคุณจะเป็น~/.folder?
เกล็

คำตอบ:


46

หากคุณต้องการหลีกเลี่ยงสิ่งที่สองcdคุณสามารถใช้

(cd .folder && command --key)
another_command --key

คำตอบที่รวดเร็วมาก! ฉันยังไม่สามารถยอมรับได้เพราะระบบไม่อนุญาตให้ฉัน))
Timur Fayzrakhmanov

1
วงเล็บวิเศษ! มันทำงานอย่างไร +1
แม่นยำ

คำสั่งในวงเล็บถูกเรียกใช้ในกระบวนการเชลล์ใหม่ดังนั้นการเปลี่ยนไดเรกทอรีการตั้งค่าตัวแปรสภาพแวดล้อม ฯลฯ ภายในวงเล็บจะไม่ส่งผลกระทบต่อพาเรนต์เชลล์ที่รันคำสั่งอื่น
Florian Diesch

9
ฉันเปลี่ยน;ไป&&การวัดที่ดี หาก cd ล้มเหลว (เช่นเนื่องจากคุณพิมพ์ชื่อไดเรกทอรี) คุณอาจไม่ต้องการเรียกใช้คำสั่ง
geirha

+1 สำหรับความคิดเห็นของ @ geirha มันเป็นจุดสำคัญจริงๆ OP คุณจะพิจารณาแก้ไขไหม
jaybee

8

ไม่cd... ไม่แม้แต่ครั้งเดียว ฉันพบสองวิธี:

# Save where you are and cd to other dir
pushd .folder
command --key
# Get back where you were at the beginning.
popd
another_command --key

และที่สอง:

find . -maxdepth 1 -type d -name ".folder" -execdir command --key \;
another_command --key

1

ฟังก์ชั่นทุบตีง่ายสำหรับการเรียกใช้คำสั่งในไดเรกทอรีเฉพาะ:

# Run a command in specific directory
run_within_dir() {
    target_dir="$1"
    previous_dir=$(pwd)
    shift
    cd $target_dir && "$@"
    cd $previous_dir
}

การใช้งาน:

$ cd ~
$ run_within_dir /tmp ls -l  # change into `/tmp` dir before running `ls -al`
$ pwd  # still at home dir

0

ฉันต้องการทำสิ่งนี้ในลักษณะที่ไม่มีการทุบตีและรู้สึกประหลาดใจที่ไม่มีประโยชน์ (คล้ายกับenv(1)หรือsudo(1)เรียกใช้คำสั่งในไดเรกทอรีทำงานที่แก้ไขดังนั้นฉันจึงเขียนโปรแกรม C อย่างง่ายที่ทำ:

#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>

char ENV_PATH[8192] = "PWD=";

int main(int argc, char** argv) {
    if(argc < 3) {
        fprintf(stderr, "Usage: in <dir> <cmd> [<args>...]\n");
        return 1;
    }

    if(chdir(argv[1])) {
        fprintf(stderr, "Error setting working directory to \"%s\"\n", argv[1]);
        return 2;
    }

    if(!getcwd(ENV_PATH + 4, 8192-4)) {
        fprintf(stderr, "Error getting the full path to the working directory \"%s\"\n", argv[1]);
        return 3;
    }

    if(putenv(ENV_PATH)) {
        fprintf(stderr, "Error setting the environment variable \"%s\"\n", ENV_PATH);
        return 4;
    }

    execvp(argv[2], argv+2);
}

การใช้งานเป็นเช่นนี้:

$ in /path/to/directory command --key
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.