Chỉ va vào một cái gì đó tương tự; hy vọng nó là oK để gửi ghi chú của tôi. Một điều khiến tôi bối rối về gitbí danh với các đối số, có lẽ đến từ git help config(tôi có phiên bản git 1.7.9.5):
Nếu việc mở rộng bí danh được bắt đầu bằng dấu chấm than, nó sẽ được coi là lệnh shell. Ví dụ: định nghĩa "alias.new =! Gitk --all --not ORIG_HEAD", cách gọi "git new" tương đương với việc chạy lệnh shell "gitk --all --not ORIG_HEAD". Lưu ý rằng các lệnh shell sẽ được thực thi từ thư mục cấp cao nhất của kho lưu trữ, có thể không nhất thiết phải là thư mục hiện tại. [...]
Cách tôi nhìn thấy - nếu một bí danh "sẽ được coi là lệnh shell" khi được thêm tiền tố vào dấu chấm than - tại sao tôi cần sử dụng hàm hoặc sh -cvới các đối số; Tại sao không chỉ viết lệnh của tôi như là?
Tôi vẫn không biết câu trả lời - nhưng tôi nghĩ thực sự có một chút khác biệt trong kết quả. Đây là một bài kiểm tra nhỏ - ném cái này vào của bạn .git/confighoặc của bạn ~/.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 "
Đây là những gì tôi nhận được khi chạy các bí danh:
$ 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/
... hoặc: khi bạn đang sử dụng lệnh "đơn giản" sau !"nguyên trạng" trong gitbí danh - sau đó gittự động nối thêm danh sách đối số vào lệnh đó! Thực ra, một cách để tránh nó, gọi kịch bản của bạn là một hàm - hoặc là đối số sh -c.
Một điều thú vị khác ở đây (đối với tôi), là trong một tập lệnh shell, người ta thường mong đợi biến tự động $0là tên tệp của tập lệnh. Nhưng đối với một githàm bí danh $0, về cơ bản, đối số là toàn bộ nội dung của chuỗi xác định lệnh đó (như được nhập trong tệp cấu hình).
Đó là lý do tại sao, tôi đoán, nếu bạn tình cờ hiểu sai - trong trường hợp dưới đây, điều đó sẽ thoát khỏi dấu ngoặc kép bên ngoài:
[alias]
# ...
fail = ! \"echo 'A' 'B'\"
... - sau đó gitsẽ thất bại với (đối với tôi, ít nhất là) thông điệp hơi khó hiểu:
$ git fail
"echo 'A' 'B'": 1: echo 'A' 'B': not found
fatal: While expanding alias 'fail': ' "echo 'A' 'B'"': No such file or directory
Tôi nghĩ, vì git"đã thấy" cả một chuỗi chỉ là một đối số !- nó đã cố chạy nó dưới dạng một tệp thực thi; và tương ứng nó không tìm thấy "echo 'A' 'B'"như một tập tin.
Trong mọi trường hợp, trong bối cảnh của git help configtrích dẫn ở trên, tôi suy đoán rằng chính xác hơn để nói một cái gì đó như: " ... lời gọi" git new "tương đương với việc chạy lệnh shell" gitk --all --not ORIG_HEAD $ @ ", trong đó $ @ là các đối số được truyền cho bí danh lệnh git từ dòng lệnh khi chạy. ... ". Tôi nghĩ điều đó cũng sẽ giải thích, tại sao cách tiếp cận "trực tiếp" trong OP không hoạt động với các tham số vị trí.
$1sẽ hoạt động).