Я наткнулся на это поведение Zsh при использовании FreeBSD:
% dd if=/dev/zero bs=1M count=1 of=~/test2
dd: failed to open '~/test2': No such file or directory
Это действительно смутило меня, потому что то же самое прекрасно работает в bash.
Я могу touch
файлы, используя тильду в Zsh, а затем ls
их:
% touch ~/test2
% ls ~/test2
/home/christoph/test2
Сначала я предположил, что zsh не понимает, что после этого идет путь, of=
поэтому он не расширяется ~
. Но автозаполнение имен файлов работает просто отлично. Фактически, если вы используете существующее имя файла, начинаете его путь с ~
, а затем нажимаете Tab в какой-то момент, путь расширяется в набираемой мной команде.
Почему zsh переходит ~/test2
на dd
нет /home/christoph/test2
?
Zsh ведет себя так же в Linux. Фактически, я выполнил эти команды выше и скопировал их результаты на машине Linux.
$HOME
вместо~
.Ответы:
~
расширяется только в нескольких контекстах . POSIX, для стандартныхsh
мандатовecho a=~
для выводаa=~
(в то время как он требует~
расширения вa=~
одиночку).zsh
однако естьmagicequalsubst
опция, которую вы можете использовать для~
расширения после,=
даже если это не в назначениях или аргументах псевдоключевых словexport
/typeset
....Так:
Обратите внимание , что
bash
, если не в POSIX /sh
режиме, расширяется~
вword=~
но только тогда , когда то , что на левом=
выглядит как буквального некотируемогоbash
имя переменной (независимо от того, является ли он в качестве аргументовtypeset
/declare
/export
или любой другой команды):источник