Perluasan tilde di zsh

11

Saya menemukan perilaku zsh saat menggunakan FreeBSD:

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

Ini benar-benar membingungkan saya karena hal yang sama berfungsi dengan baik di bash.

Saya dapat touchfile menggunakan tilde di zsh, dan kemudian ls:

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

Pada awalnya, saya berasumsi bahwa zsh tidak menyadari bahwa ada jalan setelahnya of=sehingga tidak berkembang ~. Tapi nama file pelengkapan otomatis berfungsi dengan baik. Bahkan, jika menggunakan nama file yang sudah ada, mulailah jalurnya ~, dan kemudian tekan Tab di beberapa titik, jalur tersebut akan diperluas dalam perintah yang saya ketikkan.

Mengapa zsh lulus ~/test2untuk dd, tidak /home/christoph/test2?

zsh berperilaku sama di Linux. Bahkan, saya menjalankan perintah-perintah ini di atas dan menyalin output mereka di mesin Linux.

UTF-8
sumber
Anda bisa menggunakan $HOMEbukan ~.
Ilario Gelmetti

Jawaban:

14

~diperluas hanya dalam beberapa konteks . POSIX, untuk shmandat standar echo a=~untuk output a=~(sementara mandat ~untuk diperluas a=~sendiri).

zshnamun memiliki magicequalsubstopsi yang dapat Anda gunakan untuk ~diperluas setelah =meskipun tidak dalam asimment atau argumen ke export/ typeset... pseudo-keywords.

Begitu:

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

Perhatikan bahwa bash, ketika tidak dalam POSIX / shmode, ekspansi ~dalam word=~tetapi hanya ketika apa yang ada di sebelah kiri =terlihat seperti bashnama variabel yang tidak dikutip secara literal (terlepas dari apakah itu dalam argumen ke typeset/ declare/ exportatau perintah lain):

$ 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=~
Stéphane Chazelas
sumber