
다음과 같은 표준 입력 스트림이 있다고 가정해 보겠습니다.파일 내용그리고 다음을 기대하는 명령파일 이름인수로 표준 입력 스트림의 파일 내용으로 구성된 파일에서 해당 명령을 실행하고 싶습니다.
예를 들어, 명령 대신
imageviewer mouse.jpg
magic
나는 이것을 다음과 동일하게 만드는 마법의 라인을 원합니다.
cat mouse.jpg | magic
또는 에서는 어떤 magic
모습 일까요 ?zsh
bash
바람직하게는 다음과 같이 보이고 싶습니다.
cat mouse.jpg | submagic | xargs imageviewer
submagic
즉, 표준 입력 스트림에서 임시 파일을 생성하고 생성된 파일의 파일 이름을 출력하고 싶습니다 .
행 magic
또는 submagic
은 bash 또는 zsh 명령, 내장 명령, GNU coreutils 등만 사용하는 쉘 파이프라인이어야 합니다.
이것이 전체 질문입니다. 사람들이 내가 의미하는 바를 계속 잘못 해석했기 때문에 다음은 설명과 배경일 뿐입니다.
좋아요, 그래서 분명히 했다고 생각했는데, 그렇지 않은 것 같아요.정말다음과 같은 작업을 수행하는 파이프라인을 갖고 싶습니다.
imageviewer mouse.jpg
저것정확히 시작된다~와 함께cat mouse.jpg | …
. 즉, 나는정말원하다정확히한 줄 magic
또는submagic
그런 것정확히작업 위의 파이프라인 – 제 질문은 문자 그대로 의미했습니다.
이는 특히 다음 제안된 솔루션이 작동하지 않음을 의미합니다.
- 파이프라인을 시작하는 방법
tmpfile = $(mktemp); cat mouse.jpg | …
- 다음과 같이 다시 작성
imageviewer =(cat mouse.jpg)
- 다음과 같이 다시 작성
echo mouse.jpg | xargs imageviewer
- 이를 해결하기 위해 함수나 바이너리를 사용합니다(예: 정의).
function magic () { … }
제가 관심 있는 것은 위의 파이프라인 중 하나가 작동하고 이러한 별칭의 정의에 bash 또는 zsh 명령, GNU coreutils 등만 포함되도록 별칭을 작성할 수 있는지 여부 alias magic='…'
입니다 . alias submagic='…'
스스로 쓴 것은 없습니다.
또 다른 댓글. 당신은 또는 뭔가가 imageviewer
될 것으로 생각합니다 .feh
sxiv
배경. 내 메일 클라이언트를 사용하여 메일에 첨부된 여러 이미지 파일을 열려고 했을 때 이 질문이 떠올랐습니다 neomutt
. Neomutt는 첨부된 파일에 태그를 지정한 다음 파일 내용을 사용자가 입력할 수 있는 명령줄로 파이프하는 기능을 제공합니다. 따라서 여기서는 주어진 표준 입력 스트림에서 작업을 수행하는 명령줄만 제공할 수 있습니다. 거기서 질문이 나왔습니다. 그러나 나는 원래 문제에는 관심이 없고 바로 이 질문에만 관심이 있습니다.
답변1
~ 안에bash
적어도 a를 사용프로세스 대체:
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
to 의 내용을 보내는 것은 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
submagic
Kusalananda의 답변에서 이미 제안된 명령과 유사한 스크립트를 만드는 것이 가능합니다 .
#! /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 )
제거되지 않습니다 .$TMPFILE
imageviewer
실행 후 두 번째 스크립트를 실행할 수 있는 경우 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