Mở rộng dấu ngã trong zsh


11

Tôi tình cờ thấy hành vi này của zsh khi sử dụng FreeBSD:

% dd if=/dev/zero bs=1M count=1 of=~/test2
dd: failed to open '~/test2': No such file or directory

Điều này thực sự làm tôi bối rối vì điều tương tự chỉ hoạt động tốt trong bash.

Tôi có thể touchtập tin bằng cách sử dụng dấu ngã trong zsh, và sau đó lschúng:

% touch ~/test2
% ls ~/test2
/home/christoph/test2

Lúc đầu, tôi cho rằng zsh không nhận ra rằng có một con đường sau of=nên nó không mở rộng ~. Nhưng tên tập tin tự động hoàn thành chỉ hoạt động tốt. Trong thực tế, nếu sử dụng tên tệp hiện có, bắt đầu đường dẫn của nó ~và sau đó nhấn Tab tại một số điểm, đường dẫn sẽ được mở rộng trong lệnh tôi đang nhập.

Tại sao zsh vượt qua ~/test2để dd, không /home/christoph/test2?

zsh hoạt động tương tự trên Linux. Trong thực tế, tôi đã thực hiện các lệnh trên và sao chép kết quả đầu ra của chúng trên máy Linux.


Bạn có thể sử dụng $HOMEthay vì ~.
Ilario Gelmetti

Câu trả lời:


14

~được mở rộng chỉ trong một vài bối cảnh . POSIX, cho các shnhiệm vụ tiêu chuẩn echo a=~đầu ra a=~(trong khi nó bắt buộc ~phải được mở rộng a=~một mình).

zshtuy nhiên có một magicequalsubsttùy chọn mà bạn có thể sử dụng ~để được mở rộng =ngay cả khi nó không nằm trong các xác nhận hoặc đối số cho export/ typeset... từ khóa giả.

Vì thế:

$ echo a=~
a=~
$ set -o magicequalsubst
$ echo a=~
a=/home/chazelas

Lưu ý rằng bash, khi không POSIX / shchế độ, mở rộng ~trong word=~nhưng chỉ khi những gì ở bên trái của =trông giống như một viện chứng đen bashtên biến (không phân biệt cho dù đó là trong đối số typeset/ declare/ exporthoặc bất kỳ lệnh khác):

$ bash -c 'echo a=~'
a=/home/chazelas
$ bash -c 'echo "a"=~'
a=~
$ bash -c 'var=a; echo $var=~'
a=~
$ bash -c 'echo a.b=~'
a.b=~
$ (exec -a sh bash -c 'echo a=~')
a=~
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.