Làm cách nào tôi có thể tạo bí danh cho lệnh git [hành động] (bao gồm khoảng trắng)?


29

Hầu hết các bí danh của tôi đều thuộc dạng này: alias p='pwd'

Tôi muốn bí danh git commitđể nógit commit -v

Nhưng cố gắng tạo một bí danh với một khoảng trắng sẽ gây ra lỗi:

$ alias 'git commit'='git commit -v'
-bash: alias: `git commit': invalid alias name

Câu trả lời:


31

Không phải là câu trả lời trực tiếp cho câu hỏi của bạn (vì bí danh chỉ có thể là một từ), nhưng bạn nên sử dụng git-configthay thế:

git config --global alias.civ commit -v

Điều này tạo ra một bí danh git để git civchạy git commit -v. Thật không may, AFAIK không có cách nào để ghi đè các lệnh git hiện có bằng bí danh . Tuy nhiên, bạn luôn có thể chọn một tên bí danh phù hợp để sống thay thế.


Xem ghi chú được thêm vào để trả lời về việc git configkhônggit-config
Michael Durrant

Như câu trả lời này đến các chủ đề mà bạn liên kết làm cho rõ ràng, nó có thể ghi đè lên hiện gitlệnh với bí danh, chỉ với một chút shell script. (.! Tôi không đăng nhận xét này như một lời chỉ trích, BTW Đó câu trả lời đã được đăng gần một năm sau khi bạn Tôi chỉ đăng nó với hy vọng rằng mọi người có thể tìm thấy nó hữu ích.)
sampablokuper

17

Bạn đang nói về một lệnh bao gồm một khoảng trắng, nhưng ở đây lệnh gitđó và không có khoảng trống trong đó.

Để gọi lệnh git commit , bạn cần viết nó

git\ commit ...
'git commit' ...
"git commit" ...

Nói chung, các lệnh không có khoảng trống trong tên của chúng vì lý do đó rất khó gọi chúng trong vỏ, vì vậy tôi không nghĩ rằng bạn sẽ tìm thấy một lệnh như vậy trên hệ thống của mình.

csh, tcsh hoặc zsh sẽ cho phép bạn đặt bí danh cho bất kỳ thứ nào ở trên, nhưng không bash hoặc ksh (mặc dù pdksh sẽ cho phép bạn nhưng bạn sẽ không cho phép bạn sử dụng chúng). Trong zsh:

alias "'git commit'=git commit -v"
'git commit' ...

Sẽ biến git commandlệnh (khi được gọi là 'git command'(chỉ với dấu ngoặc đơn)) thành bí danh cho gitlệnh với các đối số commit-v. Không phải những gì bạn đang tìm kiếm tôi đoán mặc dù.

aliaschỉ có thể bí danh các lệnh , tất cả những gì bạn có thể đặt bí danh ở đây là gitlệnh và bạn cần phải đặt bí danh cho thứ gì đó chèn "-v" sau khi "xác nhận" vào danh sách đối số của nó. Tốt nhất là sử dụng giải pháp của @ jw013 nhưng nếu vì lý do nào đó bạn không thể hoặc không, thay vì sử dụng bí danh, bạn có thể sử dụng chức năng để thực hiện công việc:

git() {
  if [ "$1" = commit ]; then
    shift
    set -- commit -v "$@"
  fi
  command git "$@"
}

3
Lưu ý rằng việc cho phép các bí danh có khoảng trắng hoặc các ký tự đặc biệt khác là một tính năng csh không có trong các vỏ kiểu Bourne (mà zsh mô phỏng theo một cách lạ). Các shell kiểu Bourne vô hiệu hóa mở rộng bí danh khi từ đầu tiên được trích dẫn theo bất kỳ cách nào, xem câu trả lời của Renan .
Gilles 'SO- ngừng trở nên xấu xa'

Vâng. Đó là lý do tại sao tôi nói nó chỉ hoạt động trong csh, tcsh và zsh mà không có lỗi đó. Lưu ý rằng vỏ Bourne không hỗ trợ bí danh. Bí danh đã được giới thiệu bởi csh.
Stéphane Chazelas

9

Trong Bash, bạn không thể tạo bí danh cho một lệnh với bất kỳ khoảng trắng nào trong đó.
Tuy nhiên, tôi sử dụng hàm sau trong .bashrc của mình như một cách giải quyết.

sudo() { if [[ $@ == "pacman -Syu" ]]; then command pacup.sh; else command sudo "$@"; fi; }

Cách thức hoạt động của nó là: Bạn bắt đầu với lệnh bạn muốn gọi. Trong trường hợp của tôi nó là sudo.
Sau đó, bạn đề cập đến những thông số sẽ mất. Trong trường hợp này , pacman -Syu.
Nếu, được kích hoạt, nó nên thực hiện lệnh nào? Trong tuyên bố trên nó là pacup.sh.
Khác, lệnh nào sẽ được thực thi , sudo $@. $@là, như bạn đã đoán được, danh sách tham số mà lệnh thực hiện.

Vì vậy, thực hiện lệnh cho trường hợp cụ thể của bạn, nó sẽ là:

git() { if [[ $1 == "commit" ]]; then command git commit -v; else command git "$@"; fi; }

Tuy nhiên, giải pháp này dành cho trường hợp tổng quát hơn khi bạn muốn đặt bí danh các lệnh có khoảng trắng trong chúng.
Trong trường hợp cụ thể của bạn, tôi khuyên bạn nên sử dụng giải pháp của jw013 để bí danh các lệnh git của bạn bằng cách sử dụnggit-config


Ý bạn là if [[ $1 == 'commit' ]]...sao? Việc mở rộng $ @ có thể có nhiều đối số hơn cho cam kết mà bạn thực sự muốn giữ.
kojiro

Đúng! Xấu của tôi .. Tôi chỉ đơn giản là thay đổi tuyên bố mà tôi đang sử dụng cho hệ thống của tôi.
darnir

Điều này thật tuyệt - cảm ơn - nó hoàn hảo cho những gì tôi cần;
Csseller

4

Từ trang bí danh bash

Từ đầu tiên của mỗi lệnh đơn giản, nếu không được trích dẫn, được kiểm tra xem nó có bí danh không. Nếu vậy, từ đó được thay thế bằng văn bản của bí danh. Tên bí danh và văn bản thay thế có thể chứa bất kỳ đầu vào shell hợp lệ nào, bao gồm cả siêu ký tự shell, ngoại trừ tên bí danh có thể không chứa `= '.

Từ đầu tiên của văn bản thay thế được kiểm tra các bí danh, nhưng một từ giống hệt với bí danh đang được mở rộng không được mở rộng lần thứ hai. Điều này có nghĩa là người ta có thể bí danh ls thành "ls -F", và Bash không cố gắng mở rộng đệ quy văn bản thay thế.

Vì vậy, vì chỉ từ đầu tiên được chọn, bạn không thể có bí danh có nhiều từ. Trong câu hỏi Siêu người dùng này , một cách giải quyết sử dụng hàm được cung cấp:

ls() { if [[ $@ == "-la" ]]; then command ls -la | more; else command ls "$@"; fi; }

Nó có thể được thích nghi với git.


Liên kết mà bạn cung cấp khác với tài liệu bash tôi có và dường như mâu thuẫn với hành vi bash. Nó nói ở trên rằng các khoảng trắng chẳng hạn được phép trong các tên bí danh. Nó trông giống như hành vi zsh với tôi ngay cả khi trang đó nói rõ ràng là bash.
Stéphane Chazelas

2
@sch Bourne / POSIX shell bỏ qua việc mở rộng bí danh nếu một từ được trích dẫn theo bất kỳ cách nào. Ví dụ \lsbỏ qua một bí danh cho ls.
Gilles 'SO- ngừng trở nên xấu xa'

1
@Gilles. Vỏ Bourne không thực hiện các bí danh. POSIX cho biết một từ không được trích dẫn khớp với tên bí danh hợp lệ (chỉ là ASCII alnum + [_!%,@]) sẽ được mở rộng. Không cấm các tiện ích mở rộng như bí danh của zsh là '\ ls' hoặc bí danh của ksh / dash / bash / zsh a-bnếu không sẽ không tồn tại bất kỳ vỏ POSIX nào. Nó chỉ nói một tập lệnh di động (không phải shell) không nên sử dụng bất kỳ bí danh nào như vậy.
Stéphane Chazelas

2
@sch POSIX cho phép triển khai sử dụng các ký tự khác trong bí danh nhưng trích dẫn bất kỳ phần nào của từ này ngăn cản việc mở rộng bí danh . Nếu bạn viết 'git commit'ở vị trí lệnh trong trình bao POSIX, nó phải gọi một tiện ích tích hợp, hàm hoặc lệnh bên ngoài.
Gilles 'SO- ngừng trở nên xấu xa'

0

Mặc dù giải pháp chính xác là sử dụng các bí danh như jw013 đã đề xuất, để tạo bí danh với các khoảng trắng bạn có thể đặt bí danh NEST.

Ví dụ: tôi có một bí danh để xóa chi nhánh cả cục bộ và từ xa, nhưng tôi muốn người dùng chỉ định chi nhánh luôn:

remrem = "!sh -c 'if [ $# -ne 1 ]; then git specBranch; else git push origin :$1 && git branch -d $1; fi' -"

#echoing aliases
specBranch = "!sh -c 'echo Specify branch please!'" 

-1

Từ ví dụ này , điều này sẽ hoạt động:

Vì vậy, nếu bạn vẫn muốn sử dụng sudo với các lệnh khác nhưng không tắt máy và nếu bạn có đủ khả năng để bí danh tắt máy sang thứ khác, bạn có thể có:

alias sudo='sudo '
alias shutdown="echo nope"

Nhưng với các lệnh của bạn:

alias git='git '
alias commit="commit -v"
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.