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ề git
bí 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 -c
vớ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/config
hoặ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 git
bí danh - sau đó git
tự độ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 $0
là tên tệp của tập lệnh. Nhưng đối với một git
hà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 đó git
sẽ 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 config
trí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í.
$1
sẽ hoạt động).