Bagaimana saya bisa menjalankan perintah dalam folder tanpa mengubah direktori saya saat ini untuk itu?

18

Mungkin itu terasa aneh bagi Anda, tetapi saya ingin menjalankan perintah di folder tertentu tanpa mengubah folder saat ini di shell. Contoh - inilah yang biasanya saya lakukan:

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

Meskipun saya menginginkan sesuatu seperti ini:

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

Apa itu mungkin?

Timur Fayzrakhmanov
sumber
Tidak bisa Anda lakukan ~/.folder/command --key? Apakah commandmemerlukan direktori Anda saat ini ~/.folder?
glenn jackman

Jawaban:

45

Jika Anda ingin menghindari yang kedua cddapat Anda gunakan

(cd .folder && command --key)
another_command --key
Florian Diesch
sumber
Jawaban yang sangat cepat! Saya bahkan tidak bisa menerimanya karena sistem tidak mengizinkan saya))
Timur Fayzrakhmanov
1
kurung ajaib! bagaimana cara kerjanya? +1
tepat
Perintah-perintah di dalam tanda kurung dijalankan dalam proses shell baru sehingga mengubah direktori, mengatur variabel lingkungan dll di dalam tanda kurung tidak mempengaruhi shell induk yang menjalankan perintah lainnya.
Florian Diesch
8
Saya akan mengubah ;untuk &&untuk mengukur baik. Jika cd gagal (mis. Karena Anda salah ketik nama direktori), Anda mungkin tidak ingin menjalankan perintah.
geirha
+1 untuk komentar @ geirha. Ini poin yang sangat penting. OP, apakah Anda akan mempertimbangkan untuk mengedit?
jaybee
8

Tanpa cd... Tidak sekali pun. Saya menemukan dua cara:

# 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

dan kedua:

find . -maxdepth 1 -type d -name ".folder" -execdir command --key \;
another_command --key
Radu Rădeanu
sumber
1

Fungsi bash sederhana untuk menjalankan perintah di direktori tertentu:

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

Pemakaian:

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

Saya perlu melakukan ini dengan cara bash-free, dan terkejut tidak ada utilitas (mirip dengan env(1)atau sudo(1)yang menjalankan perintah dalam direktori kerja yang dimodifikasi. Jadi, saya menulis program C sederhana yang melakukannya:

#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);
}

Penggunaannya seperti ini:

$ in /path/to/directory command --key
Lucretiel
sumber