標準入力ストリームがあるとしましょう。文書内容そして希望の命令ファイル名引数として標準入力ストリームのファイル内容で構成されたファイルに対してコマンドを実行したいと思います。
たとえば、コマンドの代わりに
imageviewer mouse.jpg
magic
同等にする魔法のラインが欲しいです。
cat mouse.jpg | magic
magic
orではどんな姿なのでしょうか?zsh
bash
好ましくは、次のようになりたい。
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
それが何かfeh
だsxiv
と思います。
背景。メールクライアントを使用してメッセージに添付された複数の画像ファイルを開こうとしたときにこの問題が発生しましたneomutt
。 Neomuttは添付ファイルにタグを付け、ファイルの内容をユーザーが入力できるコマンドラインにパイプする機能を提供します。したがって、ここでは、特定の標準入力ストリームでいくつかの操作を実行するコマンドラインのみを提供できます。ここで問題が発生します。しかし、私は元の質問には興味がなく、この質問にのみ興味があります。
ベストアンサー1
少なくともbash
、使用プロセスの交換:
utility <( some_other_utility )
utility
それからファイル名。ファイルを開いてutility
読むとsome_other_utility
。
あなたの例:
cat mouse.jpg | submagic | xargs imageviewer
送るための用途だと思います。ファイル名 mouse.jpg
imageviewer
これは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
中間コマンドは、一時ファイルが生成されるまでファイル名を出力しません。