Bagaimana cara mengatur alias pada basis per-direktori?

18

Misalkan Anda memiliki alias go, tetapi ingin melakukan hal yang berbeda di direktori yang berbeda?

Dalam satu direktori harus dijalankan cmd1, tetapi di direktori lain harus dijalankancmd2

Omong-omong, saya sudah memiliki alias untuk beralih ke direktori di atas, jadi apakah mungkin untuk menambahkan gopenugasan alias ke fooalias?

alias "foo=cd /path/to/foo"

Bekerja di bash (?) Di OSX.

B Tujuh
sumber
1
Inilah gunanya makefile.
itsbruce

Jawaban:

16

Tidak sepenuhnya yakin apa yang Anda tanyakan, tetapi sebuah alias hanya memperluas apa yang ada di alias. Jika Anda memiliki dua alias, Anda dapat menambahkan perintah yang berbeda, bahkan alias.

alias "foo=cd /path/to/foo; go"
alias "foo2=cd /path/to/foo2; go"

Dalam situasi lain apa pun, Anda dapat menentukan fungsi di .bashrc

function go ()
{
    if [ "$PWD" == "/path/to/foo" ]; then
       cmd1
    elif [ "$PWD" == "/path/to/go" ]; then
       cmd2
    fi;
}

Jika Anda memiliki lebih banyak pilihan, Anda bisa menggunakan struktur case dengan lebih baik.

Bernhard
sumber
4

Saya merasa Anda sangat "berorientasi direktori", dan, dalam hal ini, ini mungkin sesuai dengan mentalitas Anda lebih baik.

(Tapi jujur ​​saja, saya pikir ini adalah ide yang buruk, Anda ingin perintah menjadi global.)

Dalam .bashrc, masukkan alias go="./.cmd"(lalu source ~/.bashrc).

Kemudian, di setiap direktori seperti itu, letakkan sebuah skrip bernama .cmd, lalu chmod +x .cmd, lalu golakukan saja.

Emanuel Berg
sumber
2
Itu banyak pekerjaan ... ini kasus penggunaannya: Saat menjalankan tes, saya ingin alias rspec-all untuk menjalankan tes tertentu. Tetapi tes mana yang tergantung pada proyek. Dan itu ditentukan oleh direktori.
B Tujuh
2
Apa yang bisa saya lihat, Anda memiliki dua opsi, baik menggunakan satu fungsi (seperti @Bernhard dijelaskan di atas), dan cabang tergantung pada direktori (seperti katanya), atau, Anda bisa meletakkan parameter di direktori. Kalau dipikir-pikir, itu tidak harus skrip, Anda bisa saja meletakkan file ( touch .TESTNO; echo 2 > .TESTNO) di setiap direktori, dan kemudian, dalam fungsi Anda, cari file itu, dan cabang menurut nomor tes file .TESTNO apa mengandung. Meskipun sama sekali tidak sulit, Anda mungkin tidak dapat menggunakan alias untuk ini; Anda harus menggunakan suatu fungsi.
Emanuel Berg
2

Saya sedang mengerjakan proyek yang hanya menyelesaikan itu. Lihat ini: localalias .

Ini demo:

masukkan deskripsi gambar di sini

Cukup lucu, saya benar-benar digunakan gosebagai contoh dalam demo. Saya tidak menunjukkan direktori switching (sesuatu yang saya harus ubah tentang demo) tetapi fungsi dengan laperintah memang lokal ke direktori tempat mereka didefinisikan.

Bryan Bugyi
sumber
1
function go() {
  if [ ! -e "./.cmd1" ]
    then command go -a $1
    else command go -b $1
  fi
}

Hal serupa, tetapi dengan asumsi "pergi" adalah perintah yang Anda inginkan memiliki fungsionalitas berbeda dari dalam direktori tertentu.

rencana kedua
sumber
1

Jika Anda menambahkan fungsi berikut ke .bashrc Anda

function cd () { 
  builtin cd "$@" && [[ -f .aliases ]] && . .aliases
  return 0
}

Setiap kali Anda cd ke direktori dengan file .aliases itu akan bersumber.

Hati-hati dengan keamanan jika orang lain dapat membuat file di mesin Anda.

Dengan trik ini alias tidak pernah dihapus tetapi Anda dapat menulis kode sebanyak yang Anda suka di fungsi.

ondir menggunakan trik ini dan memiliki banyak lonceng dan peluit.

http://swapoff.org/ondir.html#download

teknopaul
sumber
Sementara saya pikir ini pintar, sepertinya berbahaya karena itu bergantung .bashrc. ( cronMisalnya, ini tidak akan berfungsi ).
ctbrown
Saya tidak yakin ada sesuatu yang berbahaya tentang bashrc. Saya percaya bahwa ini adalah tempat standar / benar untuk alias. Dalam sifat lingkungan mereka berbeda. Berikan pertanyaan, lingkungan yang berbeda adalah apa yang diperlukan. Tidak ada yang menghentikan Anda mencari pengguna .bashrc di cron jika Anda ingin cron memiliki lingkungan yang serupa . NB cron harus selalu diharapkan berperilaku berbeda dengan shell interaktif karena penggunaan isatty dan sahabat.
teknopaul
Benar, tidak ada yang berbahaya tentang bashrc itu sendiri. Masalahnya adalah Anda tidak memiliki cara untuk memastikan bahwa proses yang berubah ke direktori akan menjadi sumber bashrc. Ini adalah satu hal jika itu adalah sesi interaktif Anda. Lain lagi jika direktori tersebut dibagi di antara pengguna dan proses yang mungkin atau mungkin tidak menggunakan bash shell. .bash_aliases adalah lokasi yang disukai untuk alias bash pada beberapa sistem.
ctbrown