設計された例:
#!/usr/bin/bash
MYVAR=$(cat /somedir | grep -i myval)
今私は以下が欲しい:
#!/usr/bin/bash
BASEDIR=/somedir
MYVAR=$(cat [BASEDIR?] | grep -i myval)
変数はサブシェルにどのように渡すべきですか?
ベストアンサー1
のみ:
#!/bin/sh -
BASEDIR=/somedir
MYVAR=$(grep -rie myval -- "$BASEDIR")
子シェルは親シェルのコピーであり、変数やその他のほとんどのエントリを含むすべてのメモリを継承します。
cat
ディレクトリで実行することはほとんど意味がありません。ここでは、変数の内容を引数として渡し、grep
(非標準)-r
オプションを使用して、grep
そのディレクトリの再帰降下で見つかったファイルをgrepします。
個々のファイルをリンクすることはcat
あまり意味がありません。
このためにbashをインストールする必要はありません。sh
インストールも同様に良く、おそらくより効率的です。
grep
ディレクトリを繰り返し降順に見つけたすべての一般ファイルの接続を実行するには、次のようにします。
MY_VAR=$(find -- "$BASEDIR" -type f -exec cat {} + | grep -i myval)
したがって、これらのファイルは特定の順序でリンクされません。 GNUを使用すると、grep
次のこともできます。
MYVAR=$(grep -rhie myval -- "$BASEDIR")
whereは、-h
同様の効果を得るために一致する行が見つかったファイル名の印刷をスキップします。順序が異なる場合があり、一部のファイルに区切り文字がない最後の数行がある場合でも、違いが発生する可能性があります。