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

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

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

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

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中間コマンドは、一時ファイルが生成されるまでファイル名を出力しません。

答え2

質問を明確にしたsubmagic後、回答を編集しました。

zshコマンド出力から一時ファイルを作成できます=( ... )<( ... )デバイスファイル(/dev/fd...名前付きパイプなど)を使用するのとは対照的に、この形式は検索=( ... )可能な一時ファイルを作成します。バラよりhttp://zsh.sourceforge.net/Doc/Release/Expansion.html#Process-Substitution

これがcat mouse.jpgイメージデータをstdoutに送信するコマンドの例にすぎないと仮定すると、次のようになります。

imageviewer =(cat mouse.jpg)

特定の拡張子を持つためにzshによって生成された一時ファイルが必要な場合は、次のように設定できます。TMPSUFFIX特殊変数):

(TMPSUFFIX=.jpg; imageviewer =(cat mouse.jpg))

セカンドアップデート

文法にこだわるなら

cat mouse.jpg | submagic | xargs imageviewer

submagicKusalanandaの回答ですでに提案されているコマンドに似たスクリプトを作成することができます。

#! /bin/sh

# A fixed name allows multiple runs without creating lots of files and
# allows a simple script to remove the file afterwards.
TMPFILE=/tmp/submagic.tmp.jpg
rm -f "$TMPFILE" && cat > "$TMPFILE" && echo "$TMPFILE"

シェルメカニズムとは異なり、これらのメカニズムは=( cat mouse.jpg )実行後も削除されません。$TMPFILEimageviewer

その後、2番目のスクリプトを実行できる場合は、名前がimageviewerわかっている場合はファイルを削除できます。

スクリプトsubmagic-cleanup

#! /bin/sh

# A fixed name allows a simple script for cleaning up.
TMPFILE=/tmp/submagic.tmp.jpg
rm -f "$TMPFILE"

だからあなたは実行することができます

cat mouse.jpg | submagic | xargs imageviewer
submagic-cleanup

答え3

質問の正確な要件を満たすには、次のようにします。

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

関連情報