在zsh中扩展代字号


11

我在使用FreeBSD时偶然发现了zsh的这种行为:

% 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传递~/test2dd而不是/home/christoph/test2

zsh在Linux上的行为相同。实际上,我在上面执行了这些命令并将其输出复制到Linux机器上。


您可以使用$HOME代替~
Ilario Gelmetti

Answers:


15

~仅在少数情况下扩展。POSIX,用于标准sh授权echo a=~输出a=~(而其授权~单独扩展a=~)。

zsh但是magicequalsubst,您可以使用一个选项~来扩展=它,即使它不在export/ typeset...伪关键字的赋值或参数中。

所以:

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

需要注意的是bash,在不POSIX / sh模式下,扩展~word=~但只有当什么左边的=像一个未加引号的文字看起来bash变量名(无论它是在参数typeset/ declare/ export或任何其它命令):

$ 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=~
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.