標準入力から一時ファイルを作成する

標準入力から一時ファイルを作成する

標準入力ストリームがあるとしましょう。文書内容そして希望の命令ファイル名引数として標準入力ストリームのファイル内容で構成されたファイルに対してコマンドを実行したいと思います。

たとえば、コマンドの代わりに

imageviewer mouse.jpg

magic同等にする魔法のラインが欲しいです。

cat mouse.jpg | magic

magicorではどんな姿なのでしょうか?zshbash

好ましくは、次のようになりたい。

cat mouse.jpg | submagic | xargs imageviewer

つまり、submagic標準入力ストリームから一時ファイルを生成し、生成されたファイルのファイル名を出力したいと思います。

この行は、bashまたはzshコマンド、組み込み、GNU coreutilsなどを使用するシェルパイプでなけれmagicばなりません。submagic


それがすべて問題です。人々が私が意味するものを誤解し続けているので、以下は説明と背景に過ぎません。


さて、それで明らかにしたと思いましたが、そうではありません。本物次のような機能を実行するパイプラインが欲しい

imageviewer mouse.jpg

それ始まりに過ぎないそしてcat mouse.jpg | …。つまり、本物考える正確にラインmagicまたはsubmagic類似正確に上記のパイプラインは機能します。私の問題は文字通りです。

これは、特に次の提案された回避策が機能しないことを意味します。

  • パイプラインの開始tmpfile = $(mktemp); cat mouse.jpg | …
  • 次のように書き換えimageviewer =(cat mouse.jpg)
  • 次のように書き換えecho mouse.jpg | xargs imageviewer
  • たとえば、次のように関数またはバイナリを使用して問題を解決します。function magic () { … }

エイリアスを作成できるのかalias magic='…'alias submagic='…'上記のパイプラインのいずれかを機能させることができるのか、そのエイリアスの定義がbashまたはzshコマンド、GNU coreutilsなどで構成されているのかに興味があります。 - 何もありません。私は自分で書いた。

別のコメント。あなたはimageviewerそれが何かfehsxivと思います。

背景。メールクライアントを使用してメッセージに添付された複数の画像ファイルを開こうとしたときにこの問題が発生しましたneomutt。 Neomuttは添付ファイルにタグを付け、ファイルの内容をユーザーが入力できるコマンドラインにパイプする機能を提供します。したがって、ここでは、特定の標準入力ストリームでいくつかの操作を実行するコマンドラインのみを提供できます。ここで問題が発生します。しかし、私は元の質問には興味がなく、この質問にのみ興味があります。

ベストアンサー1

少なくともbash、使用プロセスの交換:

utility <( some_other_utility )

utilityそれからファイル名。ファイルを開いてutility読むとsome_other_utility


あなたの例:

cat mouse.jpg | submagic | xargs imageviewer

送るための用途だと思います。ファイル名 mouse.jpgimageviewerこれはJPEGファイルを介して転送されたコンテンツが意味をなさないためですxargs

これは次の方法で行うことができます。

echo 'mouse.jpg' | xargs imageviewer

または

xargs imageviewer <<<'mouse.jpg'

存在するbash

mouse.jpg送信されたコンテンツは、次imageviewerのように送信できます。

cat mouse.jpg | imageviewer /dev/stdin

または手続き型置換を使用して

imageviewer <( cat mouse.jpg )

一時ファイルの使用:

tmpfile=$(mktemp)
cat mouse.jpg >"$tmpfile"

imageviewer "$tmpfile"

rm "$tmpfile"

可能、

tmpfile=$(mktemp)
cat mouse.jpg | { cat >"$tmpfile"; echo "$tmpfile"; } | xargs imageviewer
rm "$tmpfile"

このパイプは、パイプの途中でファイル名を読み取るまでxargs実行を待つという事実に依存します。imageviewer中間コマンドは、一時ファイルが生成されるまでファイル名を出力しません。

おすすめ記事