/ bin / shソース(stdinから(他のプログラムから)ファイルではない)


14

これに名前を付けるのはややこしい...

基本的に、STDOUTで実行するとシェル変数のセットを出力するプログラムがあります。

$ ./settings
SETTING_ONE="this is setting one"
SETTING_TWO="This is the second setting"
ANOTHER_SETTING="This is another setting".

STDOUTがで評価されているかのように、シェルスクリプト内からこれを実行しsourceます。

次のようなことをしたい...

source `./settings`

...しかし、もちろんそれは機能しません。

私はできることを知っています:

./settings >/tmp/file
source /tmp/file

しかし、私は本当にそれをしたくありません。

手がかりはありますか?

回答:


16

以下を使用できますeval

eval "$(./settings)"

eval "`./settings`"

申し訳ありませんが、言及する必要があります、bashではなく/ bin / shです。$()は機能しません。質問を更新しました。
マジェンコ

@Matt:まあ、shはほとんどのシステムでbashです。もちろん、ダッシュボードに置き換えられた最近のUbuntuバージョンを意味している場合を除きます。
Hello71

@Matt:その場合、バックティックは機能するはずです。しかし、あなたも正確なバージョンを追加する必要がありshます-それはダッシュ、アッシュ、ビジーボックスへのシンボリックリンクかもしれません...ライブの「本当の「sh」」のコピーを見たことがありません。
user1686

1
@Matt:面白いシステムがあります。特に、ほとんどすべての「sh」バリエーションがサポートさ$( )れているため(4.3BSDの Almquistのシェルから)、POSIXもサポートされています。(注:議論していない、ちょうど好奇心。)
user1686

$()は存在しますが、この状況ではそのようには動作しません。FreeBSD 8.2の/ bin / sh
Majenko

15

/dev/fd利用可能なシステムでは、bashはプロセス置換をサポートします。

source <(./settings)

ここで<( )/dev/fd/...、の出力を./settings読み取ることができる、自動的に割り当てられたパスに展開されます。


1
bashマニュアルでは、これは「プロセス置換」と呼ばれます。
グレンジャックマン

6
declare `./settings`

またはもちろん...

export `./settings`

もちろんテストしてください...

export `echo -e "asdf=test\nqwerty=dvorak"` ; echo $asdf $qwerty

空白の処理:

eval export `./settings`

ああ、exportトリックはうまくいきます!ありがとう
マジェンコ

さて、値内のスペースをどのように処理できますか?
マジェンコ

@Matt:コメントにバッククォートを使用することはできませんので、編集された回答をご覧ください。
user1686

@grawity:はい、できますa backtick --> ` <-- and here's another one --> ` <--
...-Hello71

2

source /dev/stdin < ./settings

ただし、/ dev / stdinはLinux専用のものだと思います。


それは、設定のコンテンツのソースを取得しようとします。'./settings'でも、 '。/ settings'で失敗します:あいまい( '=バック
ティック

/dev/stdinBSDおよびCygwinでも動作します。
user1686

1
使い方は|、しかし、されていないパイプの両側が別々のサブプロセスであるため、その調達のコマンドは現在のシェルに影響を与えない、(少なくともではない正確に)仕事に行きます。
user1686

1
それを反映するように編集されました。
ローレンス

1
私はこの/dev/stdinトリックが好きですが、あなたの答えは実際にはsource ./settings実行せずにプレーンと同等です。ヒアドキュメントを使用して、これを克服できますsource /dev/stdin <<EOF \n $(./settings) \n EOF
tlwhitec

0

ここで別の視点を提供したかったのは、他の回答がファイルを作成し、stdinから直接プルしないためです。準備済みの環境情報を複数のスクリプトに送信する必要があるビルドがいくつかあります。私がやっていることは、文字列でBash互換の変数割り当てを準備することです:

Var1="Foo"
Var2="Bar"
Var3="Baz"

スクリプトを実行する準備をしているとき、上記の複数行の文字列をbase64でエンコードし、シェルスクリプトにパイプします。

echo base64EncodedParameters | build.sh

build.shで、stdinから読み取り、base64デコードして結果を評価します。

params=""
while read line; do params="${params}${line}"; done
eval `echo $params | base64 -D`

echo "Hello ${Var1} ${Var2}"
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.