bashスクリプトで使用できるように、構成ファイルに設定されているパスを抽出する必要があります。パスはそのファイル内で次のようになります。
DIR = "${HOME}/test/tmp"
引用符なしで抽出する必要がありますが、次のようにします。
TESTVAR="$(cat /home/user/path/to/file.conf | grep ^DIR | grep -o '".*"' | tr -d '"')"
問題は、コマンドが$ {HOME}変数を「正しく」解釈しないことです。私が電話したとしましょうecho $TESTVAR
。結果は次のとおりです。
/home/user/test/tmp
わかりました:
${HOME}/test/tmp
したがって、スクリプト内のコマンドの引数として使用することはできません!
美しいですか?
ベストアンサー1
拡張は再帰的に適用されません。これにより、ドル記号を含むランダムなデータは処理されません。 (関連する問題は、引用符やリダイレクト、その他の演算子も拡張された一般文字であることです。)
最も一般的な習慣の1つは、このような設定ファイルを実際のシェルスクリプトとして使用することです。したがって、(Debianのように/etc/default
)ファイルは次のようになります。
DIR="${HOME}/test/tmp"
あなたはそれを読むでしょう
. configfile
もちろんここには問題があります。つまり、ファイルは完全なシェルスクリプトであり、シェル構文に準拠し、任意のコマンドを実行するように構成する必要があるということです。
別の可能性はファイルを実行することですenvsubst
。たとえば、質問にあるファイルを使用すると、envsubst < configfile
次のように出力されます。
DIR = "/home/me/test/tmp"
または、特定の項目を拡張するために使用することもできますenvsubst '$HOME $OTHER $VARS'
。
シェルスクリプトとは異なり、envsubst
入力ファイルから割り当てを読み取ることはありません。たとえば、ROOTPATH
2行目に使用される値は、envsubst
環境から取得された値で、1行目の「割り当て」とは関係ありません。
ROOTPATH=/something/$USER
LOGPATH=$ROOTPATH/logs