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 touch
file 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 ~/test2
untuk 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.
$HOME
bukan~
.Jawaban:
~
diperluas hanya dalam beberapa konteks . POSIX, untuksh
mandat standarecho a=~
untuk outputa=~
(sementara mandat~
untuk diperluasa=~
sendiri).zsh
namun memilikimagicequalsubst
opsi yang dapat Anda gunakan untuk~
diperluas setelah=
meskipun tidak dalam asimment atau argumen keexport
/typeset
... pseudo-keywords.Begitu:
Perhatikan bahwa
bash
, ketika tidak dalam POSIX /sh
mode, ekspansi~
dalamword=~
tetapi hanya ketika apa yang ada di sebelah kiri=
terlihat sepertibash
nama variabel yang tidak dikutip secara literal (terlepas dari apakah itu dalam argumen ketypeset
/declare
/export
atau perintah lain):sumber