for i in "${arrOfFiles[@]}"; do
# OUTPUT_PATH=some dynamic naming file created earlier
perl -pe 's/%REPLACE ME%/`cat $i`/ge' -i "$OUTPUT_PATH"`
done
私のスクリプトはここにぶら下がって完了しません。 usingはcat $i
配列内のファイルの正しい内容を表示するため、$ iが機能します。何を提供しますか?
答え1
e
Perl演算子flagsを使用したくありませんs///
。-e
代替コードの右側をPerlコードで評価します。cat $i
Perlコードの内容を評価せずに置き換えるリテラルテキストとして処理しようとしています。 bashコマンドラインで一重引用符を使用しているので、cat $i
テキストは文字通りperlに渡されます表現による評価:これは、Perlがcat
(Perlの観点から)サブシェルとその内容を実行することを意味します。$i
真珠変数はまったくありません。それ以外の場合、use strict
宣言されていない変数を持つことは完全に正当であるため、cat
Perlは引数なしで呼び出されたサブシェルを開くように指示するときに文句を言いません。 cat
もちろん、標準入力を待つ引数はありません。これがスクリプトが「停止」する理由です。デフォルトでは、次のように呼び出します。
perl -e '`cat $i`;'
use strict
Perlコードに以下を追加すると、エラーが明らかになります。
perl -e 'use strict; `cat $i`;'
コードブロックは次のようにする必要があります。
for i in "${arrOfFiles[@]}"; do
perl -pi -e "s/%REPLACE ME%/`cat $i`/g;" "$OUTPUT_PATH"
done
ただし、これは常に名前付きファイルで機能します$OUTPUT_PATH
。つまり、%REPLACE ME%
そのファイルのテキストがファイル配列の最初のファイルの内容に置き換えられ、残りのファイルは何も置き換えられません。ここで正確に何をしたいのかは明確ではありません。 Perlのフラグを使用すると、コマンドライン-pi
で提供されているすべてのファイルをインライン編集するように指示できます。現在は$OUTPUT_PATH
。
これは文字列置換を実行する悪い方法かもしれません。各ファイルの内容に文字数が制限なく含まれる可能性があり、$i
Perlコマンドラインが完全に破損する可能性があります。単一/
文字だけでもPerl構文エラーが発生する可能性があり、注入を介して任意のコードを実行するシーケンスがある可能性があります。あなたは警告を受けました。