Untuk menjalankan perintah dengan direktori kerja tertentu, biasanya dilakukan
( cd directory && utility )
Tanda kurung di sekitar cd ...
berarti bahwa perintah di dalamnya berjalan dalam subkulit. Mengubah direktori yang berfungsi dalam subkulit membuatnya sehingga direktori kerja saat ini dari shell panggilan tidak berubah, yaitu, setelah memanggil perintah ini, Anda masih akan berada di direktori yang sama di mana Anda memulai.
Contoh:
( cd / && echo "$PWD" ) # will output "/"
echo "$PWD" # will output whatever directory you were in at the start
Ini tidak dapat diubah menjadi alias umum karena alias tidak dapat menerima argumen apa pun.
Untuk spesifik direktori dan utilitas, yang bisa melakukan
alias cdrun='( cd "$HOME/somedir" && ./script.sh )'
tetapi untuk kasus umum, Anda harus menggunakan fungsi shell:
cdrun () {
( cd "$1" && shift && command "$@" )
}
atau
cdrun () (
cd "$1" && shift && command "$@"
)
Mengganti kurung kurawal dengan tanda kurung di sekitar tubuh fungsi membuat fungsi mengeksekusi dalam subkulitnya sendiri.
Ini akan digunakan sebagai
$ cdrun "$HOME/somedir" ./script.sh
yang akan menjalankan skrip yang script.sh
terletak di direktori $HOME/somedir
, dengan $HOME/somedir
sebagai direktori kerja, atau
$ cdrun / ls -l
yang akan memberi Anda daftar direktori dalam "format panjang" dari direktori root.
Fungsi shell mengambil argumen pertamanya dan mencoba mengubah ke direktori itu. Jika itu berhasil, itu menggeser nama direktori dari parameter posisi (daftar argumen baris perintah) dan mengeksekusi perintah yang diberikan oleh sisa argumen. command
adalah perintah bawaan di shell yang hanya menjalankan argumennya sebagai perintah.
Semua ini diperlukan jika Anda ingin menjalankan perintah dengan direktori kerja yang diubah . Jika Anda hanya ingin mengeksekusi perintah yang berlokasi di tempat lain, Anda jelas dapat menggunakannya
alias thing='$HOME/somedir/script.sh'
tapi ini akan menjalankan script.sh
terletak di $HOME/somedir
dengan saat ini direktori sebagai direktori kerja.
Cara lain untuk mengeksekusi skrip yang berlokasi di tempat lain tanpa mengubah direktori kerja adalah dengan menambahkan lokasi skrip ke PATH
variabel lingkungan Anda , mis
PATH="$PATH:$HOME/somedir"
Sekarang script.sh
di $HOME/somedir
akan dapat dijalankan dari mana saja dengan hanya menggunakan
$ script.sh
Sekali lagi, ini tidak mengubah direktori kerja untuk perintah.
cdrun () ( cd "$1" && shift && command "$@" )
.{ ... }
untuk konsistensi dengan fungsi yang lebih lama.pushd
danpopd
(juga> /dev/null
jika Anda mencoba untuk menghindari pesan output juga), sambil juga menjaga konteksnya tetap bersih!(cd dir && thing)
juga jauh lebih portabel daripada menggunakanpushd
danpopd
.Jadi, jika Anda ingin mengubah direktori (cd) ke folder
/var/log/
dan kemudian daftar (ls) file Anda, Anda dapat menambahkan.bash_profile
file Anda di bawah ini:sumber
Saya menggunakan fungsi ini untuk menjalankan satu perintah di direktori yang berbeda:
Batasan fungsi ini adalah bahwa wildcard diselesaikan relatif terhadap direktori asli, bukan relatif terhadap direktori tempat perintah dijalankan. Dimungkinkan untuk melakukan yang lebih baik di zsh .
Fungsi ini berfungsi seperti biasa
cd
jika dipanggil dengan argumen tunggal, jadi Anda mungkin ingin menyebutnyacd
. (Fungsi ini tidak mendukung opsi apa pun, tetapi opsi untukcd
jarang digunakan.)sumber
Pisahkan perintah dengan titik koma, mis:
sumber
cd
gagal, Anda akan mendapatkan daftar direktori dari direktori yang salah. Lebih baik digunakan&&
daripada di;
sini.