grepの結果からの行を実行する方法は?


10

特定のインストール手順が記載されたテキストファイルがあり、ファイル内での一意の出現をgrepできることがわかっています。たとえば、テキストファイルは次のようになります。

MYDIR = `find / home / user -name somedir`
PERL5LIB = $ PERL5LIB:$ MYDIRをエクスポートします。

bashで、ファイル内のgrepの後に行を実行するにはどうすればよいですか?何かのようなもの:

「grep somedir INSTALLFILE」の実行結果
「grep 'export PERL5LIB' INSTALLFILE」の実行結果

2
この方法での自動実行は、ちっぽけな危険ではありませんか?
Faheem Mitha、2011年

2
@Faheemと@avilella:ほんのちょっぴりちょっとだけ、かなり危険です。また、やや壊れやすい。
カレブ

回答:


4

仮定:

  • あなたはこのファイルを制御でき、悪意のあるコードの危険にさらされていません
  • これらの変数を現在のシェルに設定したい

コマンドを一時ファイルにリダイレクトして実行することができます。

tmp=$(mktemp)
{
    grep somedir INSTALLFILE
    grep 'export PERL5LIB' INSTALLFILE
} > "$tmp"
. "$tmp"

または、結果を評価することもできます

eval "$(grep somedir INSTALLFILE)"
eval "$(grep 'export PERL5LIB' INSTALLFILE)"

古い回答を更新しています。今日私がやろうとしていることは、プロセス置換を使用することです。

source <(
    grep somedir INSTALLFILE
    grep 'export PERL5LIB' INSTALLFILE
)

source <(...)場合、bash 4以上が必要です。古いバージョンでは動作しませんでした(zshでも問題ありませんでした)。
ステファンChazelas

11

別のシェルプロセスで行を評価するには:

grep somedir INSTALLFILE | sh

実行中のシェルプロセスの行を評価するには:

eval "$(grep somedir INSTALLFILE)"

+1は、木々の間から森を見る唯一の存在です。これで私の答えを削除します。@avilella:便宜上、-A 1またはのいずれか-B 1でフラグとしてgrep使用して、1つのgrepで両方の行をフェッチし、@ Gillesソリューションのいずれかでそれを使用できます。
カレブ2011年

一部のシステムでshは、予期していたシェルではなく別のシェルへのシンボリックリンクが存在する可能性があるため、結果は予測できない場合があります。安全のために、期待する正確なシェルを指定してください。例grep somedir INSTALLFILE | bash
thdoan

-2

次のように、検索の「exec」機能の使用を検討しましたか?

find somedir -name INSTALLFILE -exec {}\;

OPは、findから返されるすべての結果を実行するのではなく、grep gromから返される結果を実行しようとしていると思います。
カレブ2011年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.