명령의 출력으로 임의의 데이터가 있습니다(예: 출력의 이진 데이터 조각 사용 tail
). 파일을 인수(예 rawtopng [filein] [fileout]
: )로만 허용하고 대시( -
) 인수를 지원하지 않으며 그 사이에 임시 파일을 만들 수 없는 다른 명령/프로그램에 이 파일을 제공하고 싶습니다 . Bash에서 어떻게 할 수 있나요?
rawtopng <(tail myfile) fileout
일 같은 일도 하시나요 ?
답변1
프로세스 대체는 rawtopng <(tail myfile) fileout
파이프( 와 마찬가지로 tail myfile | rawtopng - fileout
)를 생성하고 파이프 이름을 프로그램에 전달합니다. Linux에서는 rawtopng
비슷한 이름이 표시되며 /dev/fd/42
파일 형식을 쿼리하면 파이프라는 메시지가 표시됩니다. 파일 시스템에 쓸 필요가 없습니다(이것은 명명된 파이프가 아닌 익명 파이프입니다). 다음과 같은 명령을 실행하여 무슨 일이 일어나고 있는지 확인할 수 있습니다.ls -ld <(echo foo)
이것이 작동할까요? 명령에 필요한 내용 에 따라 다릅니다 rawtopng
(모르겠습니다. 명령에 익숙하지 않습니다). 파일에서 읽는 것이 전부라면 괜찮습니다. 파일을 찾아야 하는 경우(즉, 입력을 처음부터 끝까지 선형적으로 읽지 않는 경우) 또는 작업을 시작하기 전에 입력의 크기를 알아야 하는 경우에는 작동하지 않습니다. 이 경우 임시 파일이 필요합니다.
명령에 검색 가능한 입력이나 크기가 미리 알려진 입력이 필요한 경우 선택의 여지가 없으며 임시 파일을 만들어야 합니다. 디스크에 쓰지 않으려면 tmpfs
Unix 변형이 해당 기능을 제공하는 경우(Linux에서는) 파일 시스템에 파일을 저장하도록 조정할 수 있습니다. mktemp
다음 명령을 사용하여 임시 파일을 만들 수 있습니다 .
tmp=$(TMPDIR=/tmp mktemp XXXXXXXXXXXX.raw)
rawtopng "$tmp" fileout
rm "$tmp"
zsh에서 프로세스 대체 변형은 rawtopng =(tail myfile) fileout
임시 파일을 생성하고 명령이 완료된 후 삭제합니다.
프로세스 교체가 해결할 수 없는 또 다른 상황은 프로그램이 특정 확장자를 가진 파일을 사용하도록 요구하는 경우입니다. 이 경우 명명된 파이프를 만드는 것이 도움이 될 수 있습니다.
mkfifo /tmp/foo.raw
tail myfile >/tmp/foo.raw &
rawtopng /tmp/foo.raw fileout
rm /tmp/foo.raw
답변2
나는 당신이 올바른 길을 가고 있다고 생각합니다! <(tail myfile)
익명의 명명된 파이프를 생성하며 Bash 유형입니다.프로세스 교체.
/dev/fd/XX
일반적으로 이는 실행 중인 프로세스의 파일 설명자 인터페이스인 "filename"으로 전달 됩니다 .
링크된 문서의 예:
bash$ wc <(cat /usr/share/dict/linux.words)
483523 483523 4992010 /dev/fd/63
프로세스에서 읽으려면 를 사용 <(command)
하고 프로세스에 쓰려면 를 사용합니다 >(command)
.
프로세스 대체에 대해 자세히 알아볼 수 있습니다.위키피디아에서게다가.
답변3
명명된 파이프를 생성할 수 있습니다.
mkfifo input
파이프라인 생성 과 같은 작업을 수행합니다 .
출력을 읽고 싶은 프로그램을 시작하고 출력을 파이프(즉, 파이프)로 리디렉션합니다.myprog > input
그런 다음 입력을 파일로 사용하여 다른 명령을 실행합니다.
파이프는 단방향입니다. 프로그램은 읽을 수는 있지만 쓸 수는 없습니다.