zshでチルダを拡張する

zshでチルダを拡張する

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がなぜ~/test2渡されるddのです/home/christoph/test2か?

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

ベストアンサー1

~場合によってのみ延長。 POSIX、標準sh要件echo a=~出力用(別途拡張がa=~必要)~a=~

zshただし、/ ...類似キーワードの割り当てやパラメータにない場合でも、¹以降に拡張するmagicequalsubstオプションがあります。~=exporttypeset

だから:

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

bashPOSIX /モードでない場合、shinは左側の内容が引用符なしのリテラル変数名のように見える場合にのみ拡張されます~(または他のコマンドの引数にあるかどうかにかかわらず)。word=~=bashtypesetdeclareexport

$ 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=$HOMEecho "a=$HOME"


リテラルおよび引用符のないコンテンツ、またはglobsubstアクティブ化された拡張機能によって生成されたコンテンツのみが適用されます。ファイル名拡張子(別.....ワイルドカードまた〜として知られていますファイル名の生成)は(シミュレーションのように)アクティブにならないたびに実行される~形式です。これら2つの出力があります。shfileexpansionshvar='a=~' zsh -o magicequalsubst -o globsubst -c 'echo $var'var='a=~' zsh -o magicequalsubst -c 'echo $~var'a=/home/dir

² チルダ拡張自体は、以前のバージョンの bash で globbing を経ない限り、分割+glob を経ません。それにもかかわらず、チルダの拡張は二重引用符内では行われません。

おすすめ記事