ファイルをインラインで変更し、stdin/stdout を許可するコマンドを実行します。

ファイルをインラインで変更し、stdin/stdout を許可するコマンドを実行します。

fooファイルをインポートし、そのファイルからいくつかの変換(たとえば)を実行するコマンドがあるとしますsed -i。このコマンドは、従来の「stdinからの読み取り、変換、stdoutへの書き込み」オプションを許可しないと想定されています。

stdin / stdoutワークフローを許可するようにこのコマンドを「変換」する方法はありますか?

私が考えることができる最初のことは、一時ファイルを使用する一種のラッパーを書くことです。しかし、これを行うことができる標準化された「メタツール」(またはいくつかのbashトリック)があるかどうか疑問に思います。

ベストアンサー1

少しチーズの味がしますが、次のようになります。

my_temp_file=$(mktemp)
cat > "$my_temp_file"
foo "$my_temp_file"
cat "$my_temp_file"
rm -f "$my_temp_file"

明確でない場合

  • 標準入力を読み、それをファイルに書き込みます。
  • foo一時ファイルからプログラムを呼び出します。
  • 一時ファイルを読み込み、標準出力に書き込みます。
  • 一時ファイルを削除します。

作業中のデータが大きすぎて保存できない場合は、一時ファイルをより多くの空き領域を持つファイルシステムに配置するオプションを/tmp使用して、この問題を多少軽減できます。--tmpdirmktemp

&&最近では、connectコマンドが非常に人気があります。と言う方が合理的かもしれません。

my_temp_file=$(mktemp) && {
    cat > "$my_temp_file"  && {
        foo "$my_temp_file"
        cat "$my_temp_file"
    }
    rm -f "$my_temp_file"
}

なぜなら

  • 失敗すると、mktemp一時ファイルもなく、できることも多くありません。
  • 失敗した場合は、cat > "$my_temp_file"入力をキャプチャしていないため、何もできません(一時ファイルを削除しない限り)。

終了ステータスがfoo重要な場合は、適切に処理してください。

traprm問題が発生しても防弾機能を強化するように設定することでこれを行うオプションがあります。

おすすめ記事