Biến Shell $ _ không hoạt động như mong đợi


11

Lý do số lượng dòng khác nhau là gì?

$ head -n 100000 ./access.log > ./data/log.sample
$ cat $_ | wc -l
1933424

1
Đồng thời truy cập Thông số đặc biệt cho bash
Pandya

1
Trong ngữ cảnh tương tác, !$thực hiện những gì bạn muốn, nhưng nó sẽ không hoạt động trong kịch bản IIRC.
zwol

@zwol: Vâng. Tôi đã hỏi một câu hỏi về nó.
Loom

Bạn nên sử dụng teelệnh trong kịch bản của bạn.
Diti

Câu trả lời:


26

$_đang mở rộng thành ./access.log(đối số cuối cùng của lệnh được thực thi cuối cùng), không ./data/log.sample.

Vì vậy, bạn đang thực sự nhìn thấy số lượng dòng ./access.log.

Chuyển hướng ( >) không phải là một phần của headlệnh vì nó được thực hiện bởi shell trước khi headlệnh thậm chí được bắt đầu. Do đó với $_bạn sẽ nhận được ./access.log.


Từ man bash:

($ _, một dấu gạch dưới.) Khi khởi động shell, được đặt thành tên đường dẫn tuyệt đối được sử dụng để gọi shell hoặc shell script đang được thực thi như được truyền trong môi trường hoặc danh sách đối số. Sau đó, mở rộng đối số cuối cùng sang lệnh trước đó , sau khi mở rộng. Cũng được đặt thành tên đường dẫn đầy đủ được sử dụng để gọi từng lệnh được thực thi và được đặt trong môi trường được xuất sang lệnh đó. Khi kiểm tra thư, tham số này giữ tên của tệp thư.


1
@ J.Chomel Tôi không chắc những gì bạn nghĩ là một lỗi, thậm chí là đùa.
chepner
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.