2013-03-19 16 views

答えて

4

ティルド展開は、シェル変数の割り当てでも発生します。destdir=~/testは類似しています。 は変数名では有効な文字ではないため、dest-dir=~/test-destdir=~/testはありません。シェルは変数割り当て(set -kが使用される場合)としてdestdir=~/testを評価していませんが、パーサーはそれをそのまま扱い、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 
+0

私はまた、「パーサがマークされた単語を文に気づきました(**コマンド名に先行するもの)とリダイレクトは後の処理のために保存されます。したがって、コマンドの後の "destdir =〜/ test"は、有効な割り当てとしてマークされていない可能性があります。次にそれを説明する方法? – lisper

+0

'set -k'シェルオプションのために、変数割り当てができます。私の推測では、パーサーはそのオプションが設定されているかどうかをチェックせず、有効な割り当てとなるものをマークします。構文解析が完了した後(ティルド展開を含む)、解析されたコマンドを評価するコードは、 'set -k'に従って、コマンドに続く代入が評価されるべきかどうかを調べることができます。変数の割り当てを最初に特定するときに 'set -k'を無視するのは、bashのバグだと主張することができます。 – chepner

+1

私はそれを手に入れます。非常に素晴らしい説明をありがとう。 – lisper

関連する問題