local::lib シェルコードが eval と $() を使用する理由

local::lib シェルコードが eval と $() を使用する理由

使用ローカル::lib行を追加するように求められます。~/.shellrc

eval $(perl -I$HOME/perl5/lib/perl5 -Mlocal::lib)

evalを使用し、その中にステートメントを含める要点が何であるか理解していません$()。私もこれをcsh使う必要がないことがわかりました。では、違いが何であるか、ユニバーサルボーンシェルに使用する必要があるか、zsh

答え1

perl -I$HOME/perl5/lib/perl5 -Mlocal::lib一部のシェルコードを印刷します。要点eval $(…)は、現在のシェルのコンテキストでコードを実行することです。これは通常、環境変数を設定するために使用されます。子プロセスの環境にのみ影響するため、これには子プロセスを使用できません。部分を得ることができます:

. /path/to/snippet-containing-variable-definitions

ただし、これは変数値を生成するコードがシェルに書き込まれた場合にのみ機能します。ここのコードはPerlで書かれているので、Perlコードはシェルコードを生成します。

暗い色他の多くのプログラムと同じ技術を使用します。

シェルのフラグメントは通常非常に単純で、変数の割り当て(通常の値の文字列)とステートメントなexportので、すべてのBourneスタイルのシェル(POSIXシェルを含む)とzshと互換性があります。これは割り当て(POSIXでは許可されていますが元のBourneシェルでは許可されていません)と組み合わせられているため、local::lib一部の10年後のシステムと互換性がありません。 Cshには異なる構文が必要です。 local::libは、部分文字列として含まれているexport場合はcsh構文をエクスポートします。 Windowsでは、cmdに対応する構文がないため、local :: libは同じcmd構文を生成します。$SHELLcsh

関連情報