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でもうまく機能するので、これは本当に私を混乱させました。

私はtouchzshでチルダを使用してファイルを作成できますls

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

最初は、zshはその後にパスがあることを認識していないため、of=展開しませんでした~。ただし、ファイル名のオートコンプリートは問題なく機能します。実際、既存のファイル名を使用し、そのパスをで開始し~、ある時点でTabを押すと、入力しているコマンドでパスが展開されます。

なぜ合格のzshん~/test2dd、ではありませんか/home/christoph/test2

Linuxでもzshは同じように動作します。実際、私は上記のコマンドを実行し、その出力をLinuxマシンにコピーしました。


$HOME代わりに使用できます~
Ilario Gelmetti

回答:


14

~いくつかのコンテキストでのみ展開されます。標準のためのPOSIX、sh義務echo a=~を出力するa=~(それが義務付けられている間~に展開するa=~のみ)。

zshただし、/ ...疑似キーワードの割り当てまたは引数に含まれていない場合でも、後で展開magicequalsubstするため~に使用できるオプションがあります。=exporttypeset

そう:

$ 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=~
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.