私は、ファイルからコンテンツを取得して現在のシェル内で実行するsource
(aka .
)ユーティリティをよく知っています。
今、私はいくつかのテキストをシェルコマンドに変換し、次のようにそれらを実行しています:
$ ls | sed ... | sh
ls
単なるランダムな例であり、元のテキストは何でもかまいません。sed
また、テキストを変換するための単なる例です。興味深いビットはsh
です。到達したものは何でもパイプsh
して実行します。
私の問題は、それは新しいサブシェルを開始することを意味します。現在のシェル内でコマンドを実行したいのですが。私がsource some-file
テキストファイルにコマンドを持っていれば、私ができるように。
汚れているので一時ファイルを作成したくありません。
または、現在のシェルとまったく同じ特性でサブシェルを開始したいと思います。
更新
わかりました。バッククォートを使用したソリューションは確かに機能しますが、出力を確認および変更しているときにこれを行う必要があることが多いので、最終的に結果を何かにパイプする方法があればもっといいと思います。
悲しいアップデート
ああ、/dev/stdin
物事はとてもきれいに見えましたが、もっと複雑なケースでは、うまくいきませんでした。
だから、私はこれを持っています:
find . -type f -iname '*.doc' | ack -v '\.doc$' | perl -pe 's/^((.*)\.doc)$/git mv -f $1 $2.doc/i' | source /dev/stdin
これにより、すべての.doc
ファイルの拡張子が小文字になります。
ちなみに、これはで処理できますがxargs
、それだけではありません。
find . -type f -iname '*.doc' | ack -v '\.doc$' | perl -pe 's/^((.*)\.doc)$/$1 $2.doc/i' | xargs -L1 git mv
したがって、前者を実行すると、すぐに終了し、何も起こりません。