2016-12-29 17 views
12

Đồng đô la dường như ám chỉ phần cuối cùng của dòng lệnh cuối cùng.

Ví dụ:

$ ls -l 
.... something 
$ !$ 
-l 
bash: -l command not found 

Tôi có thể tìm thấy rất nhiều biến đô la (ví dụ: $!) nhưng không thể thực hiện được. Có lời giải thích nào không?

+0

'' thường/thường liên quan đến các lệnh lịch sử. – user2864740

+1

Theo [câu trả lời này] (http://stackoverflow.com/a/68496), Đây là đối số cuối cùng của lệnh trước – user000001

Trả lời

18

Đó là đối số cuối cùng của lệnh trước đó. Từ documentation:

!!:$

chỉ định đối số cuối cùng của lệnh trước. Điều này có thể được rút ngắn thành !$.

Lưu ý. Nếu bạn muốn chơi xung quanh với lịch sử Bash, tôi đề nghị bạn bật tùy chọn vỏ histverify như vậy:

shopt -s histverify 

(bạn cũng có thể đặt nó trong .bashrc của bạn để có nó trên vĩnh viễn). Khi sử dụng thay thế lịch sử, sự thay thế không được thực thi ngay lập tức; thay vào đó, nó được đặt trong bộ đệm của readline, chờ bạn nhấn enter… hay không!


Để làm cho mọi việc chính xác, gõ !$ không tương đương với cách gõ "$_": !$ thực sự là một lịch sử thay thế, đề cập đến các lời cuối cùng của lệnh trước đó đã được nhập, trong khi "$_" là người cuối cùng đối số của lệnh trước đây được thực thi. Bạn có thể so sánh cả hai (Tôi có shopt -s histverify):

$ { echo zee; } 
zee 
$ echo "$_" 
zee 
$ { echo zee; } 
zee 
$ echo !$ 
$ echo } 

Ngoài ra:

$ if true; then echo one; else echo two; fi 
one 
$ echo "$_" 
one 
$ if true; then echo one; else echo two; fi 
$ echo !$ 
$ echo fi 

Và cũng:

$ echo zee; echo "$_" 
zee 
zee 
$ echo zee2; echo !$ 
$ echo zee2; echo "$_" 

Và cũng

$ echo {1..3} 
1 2 3 
$ echo "$_" 
3 
$ echo {1..3} 
1 2 3 
$ echo !$ 
$ echo {1..3} 

Và cũng

$ echo one ; 
$ echo "$_" 
one 
$ echo one ; 
one 
$ echo !$ 
$ echo ; 

Có rất nhiều ví dụ khác, ví dụ: với bí danh.

+0

^1 cho các ví dụ tuyệt vời ..... vì vậy cả hai đều dùng chung funcs, nhưng chúng r không giống nhau. – zee

+0

@zee: thực sự, họ không thực sự chơi trên cùng một cấp độ. –

+0

'++' cho tập hợp các ví dụ đẹp. – Inian

2

!$ có thể làm những gì $_ ngoại trừ thực tế là $_ không lưu trữ giá trị trả về "đó là substitution” trong lịch sử.

Đây là một ví dụ.

Với !$

za:tmep za$ ls -lad 
drwxr-xr-x 4 za staff 136 Apr 6 2016 . 
za:tmep za$ !$ 
-lad 
-bash: -lad: command not found 
za:tmep za$ history | tail -n 3 
    660 ls -lad 
    661 -lad      <<== history shows !$ substitution. 
    662 history | tail -n 3 

Với $_

za:tmep za$ ls -lad 
drwxr-xr-x 4 za staff 136 Apr 6 2016 . 
za:tmep za$ $_ 
-bash: -lad: command not found 
za:tmep za$ history | tail -n 3 
    663 ls -lad 
    664 $_   <<== history shows $_ and not its substitution. 
    665 history | tail -n 3 
za:tmep za$ 

Các tuỳ chọn khác:

!^  first argument 
!:2  second argument 
!:2-$ second to last arguments 
!:2* second to last arguments 
!:2- second to next to last arguments 
!:2-3 second to third arguments 
!$  last argument 
!*  all arguments 
+0

Về mặt kỹ thuật, '! $' Và '$ _' là ** không ** giống nhau. '! $' hoạt động ở mức cao hơn. Bạn có thể thấy sự khác biệt với bí danh hoặc với lệnh ghép hoặc nhiều lệnh. So sánh 'echo! $' Với 'echo $ _' trong các trường hợp sau: 1.' {echo zee; } '; 2. 'nếu đúng; sau đó lặp lại một; khác echo hai; fi'; 3. Ngoài ra, hãy nhập hai lệnh, ví dụ: 'echo zee; echo $ _' và 'echo zee2; echo $! '. –

Các vấn đề liên quan