Hanya menabrak sesuatu yang serupa; Saya harap posting catatan saya. Satu hal yang membingungkan saya tentang git
alias dengan argumen, mungkin berasal dari git help config
(saya punya git versi 1.7.9.5):
Jika ekspansi alias diawali dengan tanda seru, itu akan diperlakukan sebagai perintah shell. Misalnya, mendefinisikan "alias.new =! Gitk --all --not ORIG_HEAD", doa "git new" setara dengan menjalankan perintah shell "gitk --all --not ORIG_HEAD". Perhatikan bahwa perintah shell akan dieksekusi dari direktori tingkat atas dari repositori, yang mungkin bukan direktori saat ini. [...]
Cara saya melihatnya - jika alias "akan diperlakukan sebagai perintah shell" ketika diawali dengan tanda seru - mengapa saya harus menggunakan fungsi, atau sh -c
dengan argumen; mengapa tidak menulis perintah saya apa adanya?
Saya masih belum tahu jawabannya - tetapi saya pikir sebenarnya ada sedikit perbedaan dalam hasil. Inilah sedikit tes - lemparkan ini pada Anda .git/config
atau Anda ~/.gitconfig
:
[alias]
# ...
ech = "! echo rem: "
shech = "! sh -c 'echo rem:' "
fech = "! f() { echo rem: ; }; f " # must have ; after echo!
echargs = "! echo 0[[\"$0\"]] 1-\"$1\"/ A-"$@"/ "
fechargs = "! f() { echo 0[[\"$0\"]] 1-\"$1\"/ A-"$@"/ ; }; f "
Inilah yang saya dapat menjalankan alias ini:
$ git ech word1 word2
rem: word1 word2
$ git shech word1 word2
rem:
$ git fech word1 word2
rem:
$ git echargs word1 word2
0[[ echo 0[["$0"]] 1-"$1"/ A-$@/ ]] 1-word1/ A-word1 word2/ word1 word2
$ git fechargs word1 word2
0[[ f() { echo 0[["$0"]] 1-"$1"/ A-$@/ ; }; f ]] 1-word1/ A-word1 word2/
... atau: ketika Anda menggunakan perintah "biasa" setelah !
"apa adanya" di git
alias - maka git
secara otomatis menambahkan daftar argumen ke perintah itu! Memang cara untuk menghindarinya adalah dengan memanggil skrip Anda sebagai fungsi - atau sebagai argumen sh -c
.
Hal lain yang menarik di sini (bagi saya), adalah bahwa dalam skrip shell, seseorang biasanya mengharapkan variabel otomatis $0
menjadi nama file skrip. Tetapi untuk git
fungsi alias, $0
argumennya adalah, pada dasarnya, isi dari seluruh string yang menentukan perintah itu (seperti yang dimasukkan dalam file konfigurasi).
Itulah sebabnya, saya kira, jika Anda salah mengutip - dalam kasus di bawah ini, itu akan menghindari kutip ganda luar:
[alias]
# ...
fail = ! \"echo 'A' 'B'\"
... - maka git
akan gagal dengan (bagi saya, setidaknya) pesan yang agak samar:
$ git fail
"echo 'A' 'B'": 1: echo 'A' 'B': not found
fatal: While expanding alias 'fail': ' "echo 'A' 'B'"': No such file or directory
Saya pikir, karena git
"melihat" seluruh string sebagai hanya satu argumen untuk !
- ia mencoba menjalankannya sebagai file yang dapat dieksekusi; dan karenanya gagal menemukan "echo 'A' 'B'"
sebagai file.
Bagaimanapun, dalam konteks git help config
kutipan di atas, saya berspekulasi bahwa lebih akurat untuk menyatakan sesuatu seperti: " ... doa" git baru "setara dengan menjalankan perintah shell" gitk --semua --tidak ORIG_HEAD $ @ ", di mana $ @ adalah argumen yang diteruskan ke alias perintah git dari baris perintah saat runtime ... ... ". Saya pikir itu juga akan menjelaskan, mengapa pendekatan "langsung" di OP tidak bekerja dengan parameter posisi.
$1
seharusnya bekerja).