',,' có thể được đặt bí danh là '..' không?


41

Đôi khi khi tôi muốn thay đổi thư mục cha, tôi gõ nhầm cd ,,thay vì cd ... Có cách nào để tôi có thể làm cho bash coi những tuyên bố này là giống nhau không? Tôi không bao giờ sử dụng dấu phẩy trong các lệnh của tôi. Lý tưởng nhất, tôi muốn bí danh ,,để ... Khi tôi thử nó, nó không hoạt động. Tại sao không làm việc này? Làm thế nào khác tôi có thể tiếp cận vấn đề này?

$ alias ,,=..
$ cd ,,
-bash: cd: ,,: No such file or directory

6
Một bí danh là một chương trình để chạy, không phải là một đối số cho chương trình; vì vậy $ ,,sẽ phàn nàn, như vậy : bash: ..: Is a directory. (Nói cách khác, nó không phải là một thực thi.)
jpaugh

5
@jpaugh: Một cách rõ ràng hơn để nói rằng: mở rộng bí danh chỉ xảy ra trên "từ" đầu tiên của lệnh. Vì vậy, như bạn nói, nó chỉ hoạt động cho tên lệnh, không tranh luận. (Và bạn thậm chí không thể alias 'cd ,,'='cd ..'. Chà, bạn có thể, nhưng bạn phải chạy nó như cd\ ,,để biến tất cả thành một từ.)
Peter Cordes

5
Hãy xem xét zsh. Nó có bí danh toàn cầu, vì vậy alias -g ,,=..cd ,,hoạt động như bạn mong đợi.
muru

1
Suy nghĩ bên: find / -type d -exec ln -s .. {}/,, \;... ;-)
Toby Speight

2
Imho: đừng làm điều này. Sử dụng bí danh để che dấu lỗi đánh máy là một thực tế tồi. Những lỗi đó có thể kết thúc bằng mã dán hoặc bản sao chép. Nó sẽ không hoạt động trong các máy chủ hoặc tài khoản khác. Và sửa đổi như vậy (tùy thuộc vào cách nó được triển khai) có thể gây ra các lỗi khác, bất ngờ, khó gỡ lỗi. Gợi ý của tôi: nếu bạn gõ nhầm một lệnh, chỉ cần gõ lại ;-).
jjmontes

Câu trả lời:


45

ZSH:

Nếu bạn zsh alias -g ,,=".."đang sử dụng là những gì bạn cần, nhưng điều này sẽ khiến ",," được mở rộng ở mọi nơi, không chỉ khi được sử dụng cd.

Từ man zshbuiltins:

Nếu -g cờ có mặt, xác định bí danh toàn cầu; bí danh toàn cầu được mở rộng ngay cả khi chúng không xảy ra ở vị trí chỉ huy.

BASH:

Nếu bị hạn chế bash(vì câu hỏi được gắn thẻ ), hãy đọc phần sau:

Đây là một giải pháp bí danh thuần túy, theo yêu cầu, tuy nhiên điều này sẽ làm nhiều hơn yêu cầu có thể làm người dùng bực bội (xem cảnh báo ở cuối bài viết của tôi).

Trích dẫn man bash:

Nếu ký tự cuối cùng của giá trị bí danh là trống, thì từ lệnh tiếp theo sau bí danh cũng được kiểm tra để mở rộng bí danh.

Do đó nó đủ để bí danh cdvới một không gian thêm (cho phép mở rộng của các đối số tiếp theo của nó) và sau đó bí danh ,,để ... Xem đó

alias cd='cd '
alias ,,='..'

đưa ra chính xác những gì bạn cần.

Lưu ý rằng điều này đúng không chỉ đối với bash(và việc aliasthực hiện), mà tất cả các trình biên dịch POSIX. Trích dẫn một ví dụ từ man 1p alias(hướng dẫn không mô tả rõ ràng tính năng này, chỉ thông qua một ví dụ):

  1. Thiết lập nohup để nó có thể xử lý một đối số mà chính nó là tên bí danh:

           alias nohup="nohup "

Cảnh báo: Khi @PeterCordes viết trong bình luận của mình, nó sẽ tự động khiến các bí danh khác mở rộng khi được viết sau cd. Nó có thể yêu cầu bạn viết cd \grepnếu bạn muốn thay đổi thư mục thành tên grepnhưng bạn greplà bí danh grep --color=auto. Nếu không có dấu gạch chéo ngược, cdsẽ báo cáo lỗi "quá nhiều đối số" (bạn không thể cdvào hai thư mục cùng một lúc)!.


22
Đó là một hack thông minh nhưng khó chịu. Tôi sẽ không muốn làm điều đó; quá dễ dàng để vô tình cắn bạn. ví dụ: nếu bạn có bí danh cho một lệnh bạn thường chạy và bạn muốn cdvào một thư mục chứa mã nguồn của nó. Hoặc các va chạm khác giữa bí danh của bạn và tên thư mục chung. Giống như cd drsẽ mở rộng cd disown -rcho tôi, với bí danh này. Dù sao, tốt hơn nhiều để ghi đè dựng sẵn cdvới một chức năng cho những thứ như thế này, IMO.
Peter Cordes

8
+1 cho giải pháp bí danh thuần túy (tôi đã học được điều gì đó). Đồng thời tôi đồng ý với nhận xét của Peter. Một số loại cảnh báo rõ ràng nên được thêm vào câu trả lời của bạn, tôi nghĩ vậy.
Kamil Maciorowski

58

Bí danh không có nghĩa là để làm điều này, nhưng bạn có thể tạo một hàm gọi cdlà bao bọc cho thực tế cd. Cái này làm việc cho tôi! Chỉ cần đặt nó vào .bash_profiletập tin hồ sơ của bạn hoặc của bạn lựa chọn.

cd () { if [ "$1" = ",," ]; then builtin cd ..; else builtin cd "$@"; fi; }

Hoặc, với ý kiến ​​và định dạng đẹp:

cd ()
{
  if [ "$1" = ",," ]; then  # if first argument is ",,"...
    builtin cd ..           # call the builtin cd with ".." instead...
  else
    builtin cd "$@"         # else call builtin cd with original arguments 
  fi
}

BIÊN TẬP

Cảm ơn @derobert đã chỉ ra rằng if then elseở đây tốt hơn && ||. Ngoài ra, tôi chỉ nhận ra ( * facepalm *) rằng việc triển khai này sẽ chỉ hoạt động nếu bất kỳ đối số không phải đường dẫn (nghĩa là -L -P) không phải là đối số đầu tiên. Vì vậy, hãy cảnh báo, nếu bạn có thói quen gõ sai cd -L ,,thì điều này sẽ không giúp ích gì cho bạn. Và đó là không tầm thường để xử lý chính xác, tôi nghĩ.


16
@BenjiWiebe Tôi nghĩ rằng phiên bản "bình luận và định dạng đẹp" sẽ tốt hơn với một if-then-other.
zwol

Wow folks, rất nhiều ý tưởng tốt. Tôi thấy bạn đang sử dụng tính năng chỉnh sửa để chăm sóc các bản sửa lỗi cần thiết. Tôi đã không dành nhiều thời gian để thử nghiệm nó. :)
BenjiWiebe

1
Ngoài ra, chỉ cần ghi đè $1trước khi thực hiện tích hợp:cd () { [ "$1" = ",," ] && set .. ; cd "$@"; }
Toby Speight

1
@TobySpeight set .. "${@:2}", hoặc bạn mất bất cứ điều gì sau cuộc tranh luận đầu tiên.
chepner

8
Ngoài ra, về mặt kỹ thuật ..không phải là đối số đầu tiên; cdtrong bashcó thể mất một loạt các lựa chọn ( -P, -L, -@, -e).
chepner

29

Bí danh phải là từ đầu tiên của lệnh. Ngoài ra, bí danh phải được thay thế cho một từ do đó không có khoảng trắng).

Hướng dẫn tham khảo Bash: Bí danh

Bí danh cho phép một chuỗi được thay thế cho một từ khi nó được sử dụng làm từ đầu tiên của một lệnh đơn giản.

Bạn có thể bí danh cả ..,,được cd ...

$ alias ..="cd .."
$ alias ,,="cd .."
$ cd /tmp && pwd
/tmp
$ ,, && pwd
/

Đó chính xác là những gì tôi làm! : D hai dấu chấm / dấu phẩy này dễ gõ hơn nhiều so vớicd ..
rav_kr

10
+1, đó không phải là một ý tưởng tồi cả. Một cách khác để làm điều đó .. trong Bash là shopt -s autocdcho phép bạn thay đổi bất kỳ thư mục nào bằng cách chỉ cần nhập tên của nó. Tất nhiên bạn vẫn là bí danh cho,,
ilkkachu


3

Một cách khác để ..thay đổi thư mục là kích hoạt autocd tính năng của Bash :

shopt -s autocd 

Điều đó sẽ tự động thay đổi thư mục khi bạn nhập tên của một:

~$ /tmp
cd /tmp
/tmp$ 

Bạn vẫn phải tạo một bí danh cho ,,nhưng điều đó có thể được thực hiện chỉ vớialias ,,=..


2

Đã có một ứng dụng một kịch bản cho điều đó: https://github.com/shyiko/commacd (không liên kết với Stanley Shuyiko).

commacdxuất ba lệnh: ,(để nhảy về phía trước), ,,(lùi) và ,,,(lùi + tiến):

Tất cả ba người trong số họ cố gắng khớp với tiền tố đầu tiên. Chỉ khi không tìm thấy kết quả, họ mới chuyển sang kết hợp chuỗi con (mờ)

Để trả lời câu hỏi của bạn, tập lệnh bí danh dấu phẩy cho ba hàm mà nó định nghĩa:

alias ,=_commacd_forward
alias ,,=_commacd_backward
alias ,,,=_commacd_backward_forward
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.