2010-04-09 27 views
6

Tôi đang cố viết một bí danh cho cd !!: 1, lấy từ thứ 2 của lệnh trước đó và thay đổi vào thư mục của tên đó. Ví dụ: nếu tôi nhậpTôi có thể có bí danh shell đánh giá lệnh thay thế lịch sử không?

rails new_project 
cd !!:1 

dòng thứ hai sẽ cd vào thư mục "new_project".

Vì !!: 1 rất khó gõ (mặc dù ngắn, nó yêu cầu ba phím SHIFT, ở hai bên của bàn phím, và sau đó phiên bản chưa được nhấn của phím được nhập hai lần SHIFT), tôi muốn để chỉ cần gõ một cái gì đó giống như

cd- 

nhưng kể từ khi !!: 1 được đánh giá trên dòng lệnh, tôi (rõ ràng) không thể chỉ làm

alias cd-=!!:1 

hoặc tôi sẽ bị tiết kiệm một bí danh có chứa "new_project" được mã hóa cứng vào đó. Vì vậy, tôi đã thử

alias cd-='!!:1' 

Vấn đề với điều này là !!: 1 KHÔNG BAO GIỜ được đánh giá và tôi nhận được thông báo rằng không có thư mục nào có tên !!: 1 tồn tại. Làm thế nào tôi có thể làm cho một bí danh, nơi thay thế lịch sử được đánh giá AT THỜI GIAN Tôi PHÁT HÀNH COMMAND ALIAS, không phải khi tôi xác định bí danh, và không bao giờ?

(Tôi đã thử điều này trong cả hai bash và zsh, và nhận được kết quả tương tự trong cả hai.)

+0

Có thể tương tự trên Unix: http://unix.stackexchange.com/questions/85352/how-can-i-alias-sudo/85354 –

Trả lời

6

Đối với zsh:

alias cd-='cd ${${(z)$(fc -l -1)}[3]}' 

Cách hoạt động:

  1. $(fc -l -1) được đánh giá. fc -l {start} [{end}] nghĩa là «danh sách lệnh lịch sử từ {start} đến {end} hoặc cuối cùng nếu {end} không có mặt».
  2. ${(z)...} phải chia ... thành một mảng giống như trình bao (xem «Cờ mở rộng tham số» trong man zshexpn), nhưng trên thực tế, nó chia tách thành khoảng trống. Có lẽ đó chỉ là lỗi của tôi.
  3. ${...[3]} lấy giá trị thứ ba từ mảng. Giá trị đầu tiên là một số của một lệnh, thứ hai là lệnh và thứ ba và sau đó là các đối số.
+0

Tôi chỉ làm một cái gì đó tương tự và kết thúc với 'fc ... | cut -d '' -f4-', để loại bỏ số lệnh đầu tiên. –

9

Đối bash:

alias cd-='cd $(history -p !!:1)' 
+0

Rất đẹp trong bash: cảm ơn bạn! Rất tiếc, nó không hoạt động trong zsh. lịch sử và lịch sử của con người - giúp đỡ là vô ích và tôi chưa thể tìm thấy bất kỳ điều gì thông qua Googling ... bất kỳ ý tưởng nào? – iconoclast

+1

'history' là lệnh zsh tích hợp sẵn. Sử dụng 'man zshbuiltins'. – ZyX

+0

Tôi nghĩ rằng có một cách để làm điều này bằng cách sử dụng dấu ngoặc kép, quá. ví dụ. 'alias cd - = 'cd \' !!: 1 \ '''. Điều đó sẽ gọn gàng hơn (nếu tôi có thể làm cho nó hoạt động!) –

8

Một cách khác để thực hiện được điều tương tự :

Đối số cuối cùng:

cdAlt - .

hoặc

cdEsc.

Đối với đối số đầu tiên:

cdAlt - Ctrl - y

hoặc

cdEscCtrl - y