スクリプトファイルを分析していたら、以下の行に遭遇しました。
sed -i '/JBOSS_HOME\/bin\/run.sh/i \export TMP_FOLDER=$JBOSS_HOME/server/default/tmp ' /home/jboss/runJBOSSEAP.sh
このコマンドが何をするのか、まだわかりません。-i
インライン操作であることはわかっています。しかし、それが何をするのかはまだわかりません。この行を理解するのを手伝ってください。
答え1
sed -i
-i
ファイルをその場で編集する、つまり同じ名前の上に新しいバージョンを書き込むことを意味します
/JBOSS_HOME\/bin\/run.sh/
スラッシュで区切られたパターン。パターンに含まれるスラッシュはバックスラッシュで囲まれるため、これはJBOSS_HOME/bin/run.sh
. を含むすべての行に一致します (実際には正規表現なので、ドットは任意の文字に一致します)。
i \export TMP_FOLDER=$JBOSS_HOME/server/default/tmp '
パターンが一致したときに実行されるコマンドは、i
行を挿入するためのものです (現在の行の前に)。追加する行はバックスラッシュで区切られるため、文字列が追加されますexport TMP_FOLDER=$JBOSS_HOME/server/default/tmp
。
/home/jboss/runJBOSSEAP.sh
対象ファイル名。
例えば
$ echo JBOSS_HOME/bin/run.sh > pla
$ sed -i '/JBOSS_HOME\/bin\/run.sh/i \export TMP_FOLDER=$JBOSS_HOME/server/default/tmp ' pla
$ cat pla
export TMP_FOLDER=$JBOSS_HOME/server/default/tmp
JBOSS_HOME/bin/run.sh
これは、例えば次の例とほぼ同じです。ここ
答え2
ilkkachu さんの回答は素晴らしく、内容も充実しています。賛成します。BSD sed (OS X など) を使用している場合の補足情報です。次のとおりです。
sed -i '/JBOSS_HOME\/bin\/run.sh/i \export TMP_FOLDER=$JBOSS_HOME/server/default/tmp ' foo
sed: 1: "foo": invalid command code f
動作しません。BSD sed で動作させるには、まず-i
次のようにオプションを修正する必要がありますsed -i.""
。さらに、次のように別の行に挿入する必要があります。
sed -i."" '/JBOSS_HOME\/bin\/run.sh/i \
export TMP_FOLDER=$JBOSS_HOME/server/default/tmp ' foo
ただし、これは OS X にある BSD sed を使用している場合に限ります。GNU sed には適用されません。