パイプを使用したフィードソースコマンド


25

以前は、source次のようなコマンドを使用しました。

source file_name

しかし、私がやろうとしているのはこれです:

echo something | source

どちらも機能しません。

回答:


38

以来source(または.、引数としてファイルを取る)、あなたが試みることができます:

source <(echo something)

1
うまくいきました、ありがとう。そして明けましておめでとうございます!
デズモンドヒューム14

@muruこれは素晴らしい作品です。なお、「|ソースは/ dev / stdinを」持っている外観働くのを、それが実際に変数の割り当てのすべてをドロップします。理由はわかりません。理論的にはしっかりしているようです。それは狂気です。
ダスティンオプレア

2
@DustinOpreaパイプはサブシェルを作成するため、これらの変数の割り当てはすべて親シェルに影響しません。
ムル

8

ソースコマンドにはファイル引数が必要です。プロセス置換を使用して一部のシェルでそれを取得できます。これは、同じ方法でシェルが置き換えられるためです...

arg=$(echo hi)

... echoサブシェルの出力を含むコマンドラインのビット。プロセス置換の場合、サブシェルを名前付きファイル(通常/dev/fd/62または何か)に置き換えます。ファイル記述子へのリンクです。パイプでは、ファイル記述子は0なので...

echo 'echo hi' | . /dev/fd/0

... /dev/stdinまたは、場合に応じて、どんなLinuxシステムでも問題なく動作するはずです。ヒアドキュメントも同様に使用できます。

. /dev/fd/3 3<<HI
$(echo 'echo hi')
HI

次の方法で、シェルがプロセス置換を処理する方法を確認できます。

(set -x; readlink <(:))

... bashを出力ます

+ set +x
+ readlink /dev/fd/63
++ :
pipe:[2212581]

...そして、シェルが置換を行っており、readlinkファイル記述子63で開く異常なパイプから読み取っていることがわかります。

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