Làm cách nào để đặt bí danh cho một dòng thiết bị đầu cuối?


9

Tôi muốn dễ dàng đặt bí danh git-gocho dòng thiết bị đầu cuối này:

git commit -m "init "; git push; git status

Vì vậy, khi tôi nhập git-go, dòng này nên nhập.

Làm thế nào tôi có thể làm điều đó? Các câu trả lời tôi thấy chỉ bao gồm bí danh của một lệnh không có tham số. Nhưng tôi muốn đặt bí danh cho một dòng thiết bị đầu cuối tùy ý.


Bạn đã thử gì? Những câu hỏi khác bạn đã đọc? Askubfox.com/q/17536/507051 giải thích nó khá hay, chính xác câu hỏi của bạn là gì?
tráng miệng

Vấn đề của tôi là sử dụng dấu ngoặc kép thay vì dấu ngoặc đơn cho dấu ngoặc kép bên ngoài.
Philip Rego

Bạn cũng có thể làm điều đó theo cách khác xung quanh bằng cách sử dụng dấu ngoặc kép ở bên ngoài và dấu ngoặc đơn ở bên trong.
Videonauth

Câu trả lời:


13

Bạn làm điều này giống như cách bạn đặt bất kỳ bí danh nào.

alias git-go='git commit -m "init "; git push; git status'

Tình huống mà nó trở nên khó khăn không phải là khi một bí danh chạy một lệnh và chuyển các đối số cho lệnh đó, thậm chí khi một bí danh chạy nhiều lệnh cách nhau ;, mà thay vào đó là khi bạn muốn một bí danh chấp nhận và sử dụng các đối số dòng lệnh của chính nó .

Ví dụ, bất cứ điều gì bạn viết sau tên của bí danh đó sẽ được dán vào cuối, và do đó được chuyển dưới dạng đối số dòng gitlệnh cho lệnh thứ ba , sau đó git status. (Thực sự không quá nhiều khi văn bản sau được dán vào cuối, cũng như văn bản sau được để riêng và tên bí danh được thay thế bằng định nghĩa của nó.)

Vì vậy, bạn có thể chạy bí danh của mình mà không cần đối số, hoạt động và lệnh cuối cùng là git status:

git-go

Hoặc bạn có thể chạy nó với các đối số mà bạn muốn truyền vào git status. Ví dụ: khi bạn chạy nó theo cách này, lệnh cuối cùng là git-status --show-stash:

git-go --show-stash

Những gì bạn không thể làm với một bí danh trong Bash (và các shell kiểu Bourne khác) là làm cho bí danh chấp nhận các đối số dòng lệnh và đặt chúng ở nơi khác ngoài cuối.

Ví dụ: giả sử bạn muốn git-gochấp nhận một đối số mà nó sử dụng cho thông điệp cam kết. Bạn sẽ không thể viết điều này như một bí danh. Giải pháp sẽ là viết nó dưới dạng hàm shell thay thế:

git-go() { git commit -m "$1"; git push; git status; }

Trong định nghĩa của hàm shell, các tham số vị trí $1, $2v.v ... giữ các giá trị của các đối số dòng lệnh được truyền cho hàm shell. Các bí danh không có chức năng tương ứng với điều này, bởi vì mở rộng bí danh thực sự là một hình thức xử lý macro, diễn ra từ rất sớm, khi shell phân tích một lệnh.

Tất nhiên, bạn có thể viết nó dưới dạng hàm shell ngay cả khi bạn không cần sử dụng các tham số vị trí trong định nghĩa, như Videonauth gợi ý .


1
Thậm chí tốt hơn: đặt một tập lệnh có tên git-gotrong PATH của bạn và git gosẽ hoạt động.
D. Ben Knoble

10

Bạn có thể khai báo nó là một hàm trong ~/.bash_aliasestệp của bạn như vậy:

git-go(){
    git commit -m "init "
    git push
    git status
}

hoặc bạn có thể tạo bí danh trong cùng một tệp như vậy:

alias git-go='git commit -m "init "; git push; git status'

Đừng quên mở lại thiết bị đầu cuối của bạn hoặc nguồn tệp ( . ~/.bash_aliases) sau khi bạn thay đổi nó.


1
Một lợi ích của việc viết hàm shell thay vì bí danh là người ta không cần lồng dấu ngoặc kép. Câu trả lời này do đó giải quyết vấn đề trung tâm mà OP hóa ra là có nhiều vấn đề trực tiếp hơn của tôi.
Eliah Kagan

@EliahKagan Cả hai đều ổn cho câu hỏi đó mặc dù câu hỏi của bạn có nhiều trong suốt. Rất vui được gặp lại quý vị.
Videonauth

4

Khi bạn đang xử lý gitcác lệnh, bạn cũng có thể muốn biết cú pháp để thêm bí danh đặc biệt là git:

git config --global alias.go '!sh -c "git commit -m \"init\"; git push; git status"'

Điều này sẽ thêm một bí danh mới vào gitcấu hình cục bộ của bạn (at ~/.gitconfig) và cho phép bạn phát hành

git go

khi bên trong một gitkho lưu trữ. Bất cứ khi nào bạn chạy git gomột shell được gọi và lệnh git commit -m "init"; git push; git statusđược truyền cho nó.

Xem tài liệu git để biết thêm chi tiết.


3

Đó là một vấn đề trích dẫn. Tôi đã thử điều này:

alias="git commit -m "init "; git push; git status"

Nhưng đã nhận được lỗi này:

bash: ; git push; git status: command not found

Tôi đã nhận được lỗi đó bởi vì tôi đã sử dụng dấu ngoặc kép không chính xác. Đây là cú pháp đúng:

alias='git commit -m "init "; git push; git status'

Hoặc là:

alias="git commit -m 'init '; git push; git status"

Hoặc không có dấu ngoặc kép nếu không có khoảng trắng trong thông điệp cam kết:

alias="git commit -m init; git push; git status"

Cảm ơn bạn đã đăng câu trả lời này (vì câu trả lời của tôi và Videonauth không tập trung nhiều vào vấn đề trích dẫn). Vì tò mò, tại sao bạn lại muốn có một khoảng trống trong các thông điệp cam kết của mình?
Eliah Kagan

Tôi đã từng tự dán dòng này và tôi sẽ thêm một thông báo sau khoảng trắng, nhưng điều đó không có ý nghĩa ở đây nên tôi đã lấy nó ra.
Philip Rego

1
Trong trường hợp đó, bạn không cần trích dẫn init; các xử lý vỏ 'init', "init"initnhư vậy. (Vì vậy, bạn có thể muốn đặt lại phiên bản gốc và cũng hiển thị phiên bản mới, để minh họa tình huống cần trích dẫn lồng nhau.) Để có thể thêm phần còn lại của tin nhắn, bạn có thể chuyển nó dưới dạng dòng lệnh đối số nếu (như thể hiện trong câu trả lời của Videonauth và của tôi) bạn đã xác định hàm thay vì bí danh. Ví dụ, bạn có thể định nghĩa git-go() { git commit -m "init $1"; git push; git status; }(đó là những gì tôi có trong câu trả lời của mình nhưng "init $1"thay vì chỉ "$1").
Eliah Kagan

Cảm ơn đó là những gì tôi muốn thử tiếp theo.
Philip Rego
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.