いくつかのコードリファクタリングを実行した後、これが重要かどうかわからないことに気づきました。
関数定義は他のファイル(一種のライブラリ)から来ます。この関数は関数本体内のいくつかの変数を使用します。この変数は、関数が実際に実行されたときに設定されます。と言う台本ではできますが、できるだけであればスタートスクリプトですが、まだ変数は定義されていません。
こうすれば害になりますか?私が知っている限り、bashは実際に呼び出されるまで関数定義に対して何もしません。そうですか?この場合、関数で使用される未設定の変数には、関数が実際に実行される前に正しい値が含まれているため、重要ではありません。と言う。
それとも、これまで設定されていない変数を関数定義に含めると問題が発生しますか?
答え1
fn(){ printf %s\\n "${v-not set}"; }
v=value; fn; unset v; fn
value
not set
シェル関数は、シェルメモリに格納されたリテラル文字列です。定義すると解析されますが、拡張は評価されません。(シェルエイリアスを除く)またはリダイレクト。これらは以下でのみ評価されます。呼ぶ時間。
実際には、この方法では、関数が呼び出されるたびに新しい一時ファイルを使用して独自の入力を定義することができます。
fn(){ ls -l /dev/fd/0; cat; } <<INFILE
$@
INFILE
fn some args; fn other args
#in dash
lr-x------ 1 mikeserv mikeserv 64 Nov 16 12:50 /dev/fd/0 -> pipe:[4076148]
some args
lr-x------ 1 mikeserv mikeserv 64 Nov 16 12:50 /dev/fd/0 -> pipe:[4077081]
other args
#bash
lr-x------ 1 mikeserv mikeserv 64 Nov 16 12:51 /dev/fd/0 -> /tmp/sh-thd-1036060995 (deleted)
some args
lr-x------ 1 mikeserv mikeserv 64 Nov 16 12:51 /dev/fd/0 -> /tmp/sh-thd-531856742 (deleted)
other args