Bagaimana Bash dapat menjalankan perintah dalam konteks direktori yang berbeda?

95

Saya memiliki perintah umum yang dipanggil dari dalam direktori yang sangat spesifik. Hanya ada satu executable yang ada di / bin untuk program ini, dan direktori kerja saat ini sangat penting untuk menjalankannya dengan benar. Skrip mempengaruhi file yang tinggal di dalam direktori yang dijalankannya.

Sekarang, saya juga memiliki skrip shell khusus yang melakukan beberapa hal dalam satu direktori, tetapi saya perlu memanggil perintah yang disebutkan di atas seolah-olah itu ada di direktori lain.

Bagaimana Anda melakukan ini dalam skrip shell?

Marty Wallace
sumber

Jawaban:

39

Anda dapat menggunakan cdbawaan, atau pushddan popdbawaan untuk tujuan ini. Sebagai contoh:

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

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

Anda menggunakan builtin seperti perintah lainnya, dan dapat mengubah konteks direktori sebanyak yang Anda suka dalam sebuah skrip.

Todd A. Jacobs
sumber
4
Ada juga cd -di shell POSIX untuk kembali ke direktori sebelumnya. Yang mengatakan, (a) pushddan popdbenar-benar dimaksudkan untuk penggunaan interaktif, dan (b) tidak selalu aman untuk mengasumsikan bahwa Anda dapat cdkembali ke tempat Anda memulai, terutama di subsistem kompleks yang mungkin menggunakan izin terbatas secara internal (lihat stackoverflow.com/questions/ 10555284 /… ).
Geekosaur
3
Menggunakan subkulit adalah solusi yang jauh lebih baik
josh123a123
Untuk scripting, subkulit mungkin ide yang lebih baik .. Namun saya sangat senang mempelajarinya popd.
connorbode
Bisakah Anda menjelaskan apa arti :simbol di sini?
Vadim Kotov
2
@VadimKotov Saya pikir itu secara efektif tanpa operasi. Bagian man bashbacaan yang relevan : : [arguments]Tidak berpengaruh; perintah tidak melakukan apa pun selain memperluas argumen dan melakukan pengalihan yang ditentukan. Status pengembalian adalah nol.
boycy
219

Gunakan cddi subkulit; cara singkat untuk menggunakan subkulit semacam ini adalah dengan tanda kurung.

(cd wherever; mycommand ...)

Yang mengatakan, jika perintah Anda memiliki lingkungan yang diperlukan, itu harus benar-benar memastikan lingkungan itu sendiri daripada menempatkan tanggung jawab pada apa pun yang mungkin ingin menggunakannya (kecuali itu adalah perintah internal yang digunakan dalam keadaan yang sangat spesifik dalam konteks sumur. mendefinisikan sistem yang lebih besar, sehingga setiap pemanggil sudah perlu memastikan lingkungan yang dibutuhkannya). Biasanya ini akan menjadi semacam pembungkus skrip shell.

geekosaurus
sumber
Anda juga dapat menyisipkan \setelah masing ;- masing untuk perintah multi-baris dalam konteks yang sama.
Chiramisu
37
(cd /path/to/your/special/place;/bin/your-special-command ARGS)
bmargulies
sumber
20

Jika Anda ingin kembali ke direktori kerja Anda saat ini:

current_dir=$PWD;cd /path/to/your/command/dir;special command ARGS;cd $current_dir;
  1. Kami menetapkan variabel yang current_dirsama dengan Andapwd
  2. setelah itu kita akan pergi cdke tempat Anda perlu menjalankan perintah Anda
  3. lalu kami menjalankan perintah
  4. lalu kita akan cdkembali ke variabel kitacurrent_dir

Solusi Lain oleh @apieceofbart pushd && YOUR COMMAND && popd

abc123
sumber
4
atau Anda dapat melakukannyapushd && YOUR COMMAND && pulld
masing
4
@apieceofbart Saya pikir yang Anda maksud, popdbukan pulld.
Konstantin