표준 입력에서 임시 파일 만들기

표준 입력에서 임시 파일 만들기

표준 입력 스트림이 있다고 가정해 보겠습니다.문서 내용그리고 원하는 명령어파일 이름인수로 표준 입력 스트림의 파일 내용으로 구성된 파일에 대해 명령을 실행하고 싶습니다.

예를 들어, 명령 대신

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그것이 feh또는 sxiv뭔가라고 생각합니다.

배경. 메일 클라이언트를 사용하여 메시지에 첨부된 여러 이미지 파일을 열려고 했을 때 이 문제가 발생했습니다 neomutt. Neomutt는 첨부된 파일에 태그를 지정한 다음 파일 내용을 사용자가 입력할 수 있는 명령줄로 파이프하는 기능을 제공합니다. 따라서 여기서는 주어진 표준 입력 스트림에서 일부 작업을 수행하는 명령줄만 제공할 수 있습니다. 여기서 문제가 발생합니다. 하지만 나는 원래 질문에는 관심이 없고 오직 이 질문에만 관심이 있습니다.

답변1

적어도 bash, 사용프로세스 교체:

utility <( some_other_utility )

그러면utility파일 이름. 파일을 열고 utility읽으면 some_other_utility.


귀하의 예:

cat mouse.jpg | submagic | xargs imageviewer

보내기 위한 용도인 것 같아요파일 이름 mouse.jpgimageviewerJPEG 파일을 통해 전송된 콘텐츠가 의미가 없기 때문 입니다 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

그 후에 두 번째 스크립트를 실행할 수 있는 경우 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

관련 정보