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がなぜ~/test2
渡されるdd
のです/home/christoph/test2
か?
zshはLinuxでも同じように動作します。実際、上記のコマンドを実行し、その出力をLinuxシステムにコピーしました。
ベストアンサー1
~
場合によってのみ延長。 POSIX、標準sh
要件echo a=~
出力用(別途拡張がa=~
必要)~
a=~
zsh
ただし、/ ...類似キーワードの割り当てやパラメータにない場合でも、¹以降に拡張するmagicequalsubst
オプションがあります。~
=
export
typeset
だから:
$ echo a=~
a=~
$ set -o magicequalsubst
$ echo a=~
a=/home/chazelas
bash
POSIX /モードでない場合、sh
inは左側の内容が引用符なしのリテラル変数名のように見える場合にのみ拡張されます~
(または他のコマンドの引数にあるかどうかにかかわらず)。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=~
$HOME
どんな場合でも、(zshや分割+glob²を防ぐために引用された引数拡張が必要な他のBourne様シェルで)~
常に使用できます。echo a=$HOME
echo "a=$HOME"
リテラルおよび引用符のないコンテンツ、またはglobsubst
アクティブ化された拡張機能によって生成されたコンテンツのみが適用されます。ファイル名拡張子(別.....ワイルドカードまた〜として知られていますファイル名の生成)は(シミュレーションのように)アクティブにならないたびに実行される~
形式です。これら2つの出力があります。shfileexpansion
sh
var='a=~' zsh -o magicequalsubst -o globsubst -c 'echo $var'
var='a=~' zsh -o magicequalsubst -c 'echo $~var'
a=/home/dir
² チルダ拡張自体は、以前のバージョンの bash で globbing を経ない限り、分割+glob を経ません。それにもかかわらず、チルダの拡張は二重引用符内では行われません。