bashrc subtitusi malas

10

Bagaimana seseorang mendapatkan ~/.bashrcalias untuk dievaluasi$() penggantian pada waktu berjalan , alih-alih pada saat ~ / .bashrc dieksekusi (saat membuka terminal)?

Saya menjalankan perintah ini cukup sering sehingga saya ingin menambahkan alias untuknya:

svn diff -r $(svn info | grep ^Revision | awk {'print $2'}):HEAD $(svn info | grep ^URL | awk {'print $2'}) | colordiff

Namun, ketika saya menambahkannya ~/.bashrcsebagai alias, saya melihat bahwa evaluasi tersebut dikodekan ke nilai-nilai yang mereka miliki pada saat saya membuka terminal:

$ alias
alias svnbranch='svn diff -r 178184:HEAD svn+ssh://branches/t4252 | colordiff'

Jika saya membuka terminal ~maka saya mendapatkan kesalahan:

svn: E155007: '/home/dotancohen' is not a working copy
svn: E155007: '/home/dotancohen' is not a working copy
svn: E155007: '/home/dotancohen' is not a working copy
svn: E155007: '/home/dotancohen' is not a working copy
$ alias
alias svnbranch='svn diff -r :HEAD  | colordiff'
$

Saya sudah mencoba dua variasi alias ini ~/.bashrc, keduanya memiliki efek yang sama (seperti yang saya harapkan):

alias svnbranch="svn diff -r $(svn info | grep ^Revision | awk {'print $2'}):HEAD $(svn info | grep ^URL | awk {'print $2'}) | colordiff"
alias svnbranch="svn diff -r `svn info | grep ^Revision | awk {'print $2'}`:HEAD `svn info | grep ^URL | awk {'print $2'}` | colordiff"

Bagaimana cara mendapatkan ~/.bashrcalias untuk mengevaluasi $()penggantian pada waktu berjalan ?

Selain itu, bagaimana seseorang mencari situasi ini di Google? Saya sudah mencoba google di "substitusi bashrc", "substitusi lazy bashrc", dan frase kunci lainnya, tetapi saya tidak menemukan apa pun yang menurut saya seharusnya menjadi masalah yang cukup umum untuk mencari informasi.

dotancohen
sumber
2
Kenapa harus menjadi alias? Pindahkan ke skrip shell dan lakukan dengan itu. Sebagian besar sistem tipe * ix dimasukkan $HOME/binke dalam PATHjika Anda memiliki direktori seperti ini akhir-akhir ini.
Warren Young
@ WarrenYoung: Anda benar, contoh khusus ini bisa berupa skrip. Namun, saya masih ingin tahu jawabannya karena saya lebih suka alias untuk hal-hal lain dan saya pasti akan mengalami ini. Saya bisa menggeneralisasi pertanyaan Anda menjadi "mengapa Bash mendukung alias ketika apa pun bisa menjadi skrip."
dotancohen
Mengapa downvote? Bagaimana saya bisa meningkatkan pertanyaan? Saya telah memberikan contoh, upaya yang gagal, dan bahkan frasa unik yang saya coba gunakan untuk google.
dotancohen
@dotancohen: Saya pikir Anda harus menanyakannya secara terpisah. Saya akan memberikan jawaban parsial di sini: alias cdp="cd ~/projects". Tidak dapat melakukannya dalam skrip shell.
Warren Young

Jawaban:

11

Gunakan kutipan tunggal untuk menekan pemrosesan karakter khusus. Anda juga bisa melakukan backslash pada $ s.

Untuk perintah yang kompleks, Anda mungkin lebih baik menggunakan fungsi dalam hal apa pun, yang tidak memerlukan pelarian dan lebih mudah untuk membaca dan mengedit:

svnbranch() {
    svn diff -r $(svn info | grep ^Revision | awk {'print $2'}):HEAD $(svn info | grep ^URL | awk {'print $2'}) | colordiff
}

Anda dapat mendefinisikan suatu fungsi di mana saja Anda bisa mendefinisikan alias.

Michael Homer
sumber
2
awkmemiliki pola ruang juga awk '/^Revision/{ print ...}' Jadi tidak perlu grep dalam hal ini.
Valentin Bajrami