Tôi đồng ý nó không rõ ràng lắm.
1. Khi khởi động shell,
nếu _
biến là trong môi trường bash
nhận được , thì bash
nó không bị ảnh hưởng.
Đặc biệt, nếu đó là bash
vỏ được gọi bởi một bash
vỏ (mặc dù zsh
, yash
và một số ksh
hiện thực cũng làm điều đó), sau đó bash
vỏ sẽ thiết lập các _
biến môi trường đến đường dẫn của lệnh được thực thi (đó là điểm thứ 3 trong câu hỏi của bạn). Chẳng hạn, nếu bash
được gọi để diễn giải một tập lệnh là kết quả của bash
việc diễn giải shell khác :
bash-script some args
Điều đó bash
sẽ được thông qua _=/path/to/bash-scrip
trong môi trường được cung cấp bash-script
và đó là giá trị ban đầu của $_
bash
biến sẽ nằm trong bash
lớp vỏ diễn giải tập lệnh đó.
$ env -i _=whatever bash -c 'echo "$_"'
whatever
Bây giờ, nếu ứng dụng gọi không vượt qua _
biến môi trường , trình bash
vỏ được gọi sẽ khởi tạo $_
cho ứng argv[0]
dụng nhận nó có thể bash
, /path/to/bash
hoặc
/path/to/some-script
hoặc bất cứ thứ gì khác (trong ví dụ trên, đó sẽ là /bin/bash
nếu tập lệnh của tập lệnh được #! /bin/bash
hoặc /path/to/bash-script
tùy thuộc vào hệ thống ).
Vì vậy, văn bản đó là sai lệch vì nó mô tả hành vi của người gọi mà bash
không có quyền kiểm soát. Ứng dụng được gọi
bash
rất có thể hoàn toàn không được thiết lập $_
(trong thực tế, chỉ có một số shell và một vài ứng dụng tương tác hiếm, execlp()
không , chẳng hạn), hoặc nó có thể sử dụng nó cho một cái gì đó hoàn toàn khác (ví dụ, ksh93
đặt nó thành *pid*/path/to/command
).
$ env bash -c 'echo "$_"'
/usr/bin/env (env did not set it to /bin/bash, so the value we
get is the one passed to env by my interactive shell)
$ ksh93 -c 'bash -c "echo \$_"'
*20042*/bin/bash
2. Sau đó
Các Sau đó không phải là rất rõ ràng một trong hai. Trong thực tế, đó là ngay khi bash
diễn giải một lệnh đơn giản trong môi trường shell hiện tại.
Trong trường hợp của một vỏ tương tác , đó sẽ là lệnh đơn giản đầu tiên được giải thích từ /etc/bash.bashrc
ví dụ.
Chẳng hạn, tại dấu nhắc của trình bao tương tác:
$ echo "$_"
] (the last arg of the last command from my ~/.bashrc)
$ f() { echo test; }
$ echo "$_"
] (the command-line before had no simple command, so we get
the last argument of that previous echo commandline)
$ (: test)
$ echo "$_"
] (simple command, but in a sub-shell environment)
$ : test
$ echo "$_"
test
Đối với hệ vỏ không tương tác , nó sẽ là lệnh đầu tiên trong $BASH_ENV
hoặc của mã được đưa vào vỏ đó nếu $BASH_ENV
không được đặt.
3. Khi Bash thực thi một lệnh
Điểm thứ ba là một cái gì đó khác biệt và được gợi ý trong các cuộc thảo luận ở trên.
bash
, giống như một số shell khác sẽ truyền một _
biến môi trường cho các lệnh mà nó thực thi có chứa đường dẫn bash
được sử dụng làm đối số đầu tiên cho các execve()
cuộc gọi hệ thống.
$ env | grep '^_'
_=/usr/bin/env
4. Khi kiểm tra thư
Điểm thứ tư được mô tả chi tiết hơn trong phần mô tả MAILPATH
biến:
'MAILPATH'
Một danh sách tên tệp được phân tách bằng dấu hai chấm mà shell định kỳ kiểm tra thư mới .
Mỗi mục nhập danh sách có thể chỉ định thư được in khi thư mới đến trong tệp thư bằng cách tách tên tệp khỏi thư bằng '?'. Khi được sử dụng trong văn bản của tin nhắn, '$ _' sẽ mở rộng thành tên của tệp thư hiện tại.
Thí dụ:
$ MAILCHECK=1 MAILPATH='/tmp/a?New mail in <$_>' bash
bash$ echo test >> /tmp/a
New mail in </tmp/a>