Alias ​​ke CD di direktori dan memanggil perintah

21

Saya memiliki .bash_profiledan bahwa saya memiliki satu set alias. Alias-alias itu saat ini hanya menjalankan satu perintah dan itu cukup mudah. Namun saya ingin melakukan dua hal dengan alias baru yang saya coba buat.

  1. CD ke dalam direktori
  2. Jalankan perintah dari direktori itu
pengguna232103
sumber

Jawaban:

26

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.shterletak di direktori $HOME/somedir, dengan $HOME/somedirsebagai 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. commandadalah 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.shterletak di $HOME/somedirdengan 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 PATHvariabel lingkungan Anda , mis

PATH="$PATH:$HOME/somedir"

Sekarang script.shdi $HOME/somedirakan dapat dijalankan dari mana saja dengan hanya menggunakan

$ script.sh

Sekali lagi, ini tidak mengubah direktori kerja untuk perintah.

Kusalananda
sumber
2
Luar biasa, jawaban komprehensif. Saya hanya berpikir saya akan menyebutkan bahwa definisi fungsi hanya membutuhkan satu metode pengelompokan perintah dan kurung untuk subkulit cukup: cdrun () ( cd "$1" && shift && command "$@" ).
Anthony G - keadilan untuk Monica
2
@AnthonyGeoghegan Ah, itu benar. Saya selalu menggunakan { ... }untuk konsistensi dengan fungsi yang lebih lama.
Kusalananda
T&J ini tampaknya berbicara tentang situasi saya, dan mungkin merupakan peningkatan dalam menggunakan lingkungan pushddan popd(juga > /dev/nulljika Anda mencoba untuk menghindari pesan output juga), sambil juga menjaga konteksnya tetap bersih!
Pysis
1
@ Analisis Ya, (cd dir && thing)juga jauh lebih portabel daripada menggunakan pushddan popd.
Kusalananda
@ Kusalananda Benarkah? Saya sudah meminta mereka bekerja untuk setidaknya beberapa sistem.
Pysis
4
alias <name-of-the-alias>='cd <the-directory> && <command>'

Jadi, jika Anda ingin mengubah direktori (cd) ke folder /var/log/dan kemudian daftar (ls) file Anda, Anda dapat menambahkan .bash_profilefile Anda di bawah ini:

alias logs='cd /var/log/ && ls'
Nikolas
sumber
1

Saya menggunakan fungsi ini untuk menjalankan satu perintah di direktori yang berbeda:

cd1 () {
  if [ $# -eq 1 ]; then
    command cd -- "$1"
  else
    ( command cd -- "$1" && shift && "$@" )
  fi
}

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 cdjika dipanggil dengan argumen tunggal, jadi Anda mungkin ingin menyebutnya cd. (Fungsi ini tidak mendukung opsi apa pun, tetapi opsi untuk cdjarang digunakan.)

Gilles 'SANGAT berhenti menjadi jahat'
sumber
-1

Pisahkan perintah dengan titik koma, mis:

alias do_something='cd /tmp; ls'
John Elliot V
sumber
8
Jika cdgagal, Anda akan mendapatkan daftar direktori dari direktori yang salah. Lebih baik digunakan &&daripada di ;sini.
Kusalananda
@ Kusalananda benar. Anda dapat menemukan lebih banyak dalam jawaban
nikolas