5

次の状況では、チルダ展開が機能しないことがわかりました。

$ set -x

$ ./print_arg.pl destdir=~/test
+ ./print_arg.pl 'destdir=/root/test'
destdir=/root/test

$ ./print_arg.pl dest-dir=~/test
+ ./print_arg.pl 'dest-dir=~/test'
dest-dir=~/test

$ ./print_arg.pl -destdir=~/test
+ ./print_arg.pl '-destdir=~/test'
dest-dir=~/test

print_arg.pl の内容は

#!/usr/bin/perl
print $ARGV[0],"\n";

シェル処理の順序に従って、シェルは「チルダ展開」の前に単語を分割します。そして、単語の分割が実際には異なることに気付きました。結果が異なる理由は何ですか?

4

1 に答える 1

4

チルダ展開はシェル変数の割り当てでも発生しますが、これdestdir=~/testは似ています。は変数名に有効な文字ではないため、使用dest-dir=~/test-destdir=~/testないでください。-シェルはdestdir=~/test変数の代入として評価していませんが (set -k使用されている場合は評価します)、パーサーは依然としてそれをそのように扱い、RHS でチルダ展開を実行しているようです。

http://www.gnu.org/software/bash/manual/html_node/Tilde-Expansion.html#Tilde-Expansionから:

各変数の割り当ては、「:」または最初の「=」の直後に引用符で囲まれていないチルダ接頭辞がないかチェックされます。これらの場合、チルダ展開も実行されます。したがって、PATH、MAILPATH、および CDPATH への割り当てでチルダ付きのファイル名を使用することができ、シェルは展開された値を割り当てます。

-kオプション セットを使用すると、適切な変数の割り当てがそのまま処理され、 に渡される引数リストから削除されることに注意してくださいprint_arg.pl

~ $ set -kx
~ $ ./print_arg.pl destdir=~/bin foo
+ destdir=/Users/clint/bin
+ ./print_arg.pl foo
foo
~ $ ./print_arg.pl dest-dir=~/bin foo
+ ./print_arg.pl 'dest-dir=~/bin' foo
dest-dir=~/bin
于 2013-03-19T16:01:21.180 に答える