1. ホーム
  2. bash

[解決済み] 現在のシェル内でコマンドの出力を実行するには?

2023-01-13 20:12:12

質問

私は source (別名 . ) ユーティリティで、ファイルから内容を取り出して、現在のシェル内で実行します。

では、次のようにテキストをシェルコマンドに変換し、実行しています。

$ ls | sed ... | sh

ls はランダムな例で、元のテキストは何でもかまいません。 sed も、テキストを変換するための単なる例です。面白いのは sh . 私は、私が得たものを何でもパイプで sh にパイプすると、それが実行されます。

私の問題は、それが新しいサブシェルを開始することを意味することです。私はむしろ、現在のシェル内でコマンドを実行させたいと思います。私ができるようになるように source some-file もし私がテキストファイルにコマンドを持っているならば。

テンポラリファイルは汚く感じるので作りたくないです。

あるいは、現在のシェルとまったく同じ特性でサブシェルを起動したいのですが。

更新

OK、backtickを使った解決策は確かに機能しますが、私はしばしば出力をチェックしたり変更したりしながらこれを行う必要があるので、最終的に結果を何かにパイプする方法があればもっといいと思います。

悲しい更新

あ、その /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

で、前者を実行すると、すぐに終了してしまい、何も起こりません。

どうすれば解決しますか?

$ ls | sed ... | source /dev/stdin

UPDATEです。 これはbash 4.0、tcsh、dashで動作します(もしあなたが source. ). どうやらbash3.2ではバグがあったようです。 からは bash 4.0 リリースノート :

<ブロッククオート

デバイスや名前付きパイプなどの非正規ファイルからのコマンドの読み込みと実行に `.' が失敗するバグを修正しました。