grep
내가 나에게 많은 결과를 가져오는 일을 한다고 가정해 보자 . grep의 출력을 사용하여 파일 이름을 첫 번째 인수로 사용하는 명령에 전달하고 싶습니다. 예를 들어-
myCommand filename.txt
나는 이런 것을하고 싶다 -
grep "xyz" | myCommand
그러나 myCommand는 stdin에서 읽지 않으므로 파이프가 작동하지 않습니다. grep의 결과로 디스크에 임시 파일을 만들고 싶지 않습니다. 메모리와 같은 다른 방법으로 "파일"을 생성하여 myCommand
사용할 수 있습니까?
답변1
간단한 해결책은 다음과 같이 Bash의 프로세스 대체 지원을 사용하는 것입니다.
myCommand <(grep "xyz" somefile)
이는 명령의 출력을 grep
파일 설명자에 연결한 다음 /dev/fd/NNN
( NNN
fd 번호는 어디입니까) 명령에 대한 입력 파일로 전달합니다(예를 들어 명령은 실제로 로 실행될 수 있습니다 myCommand /dev/fd/63
). 이 솔루션확실히임시 파일을 만듭니다.
명명된 파이프를 생성하고 이를 사용하여 데이터를 전송할 수도 있습니다.
$ mkfifo /tmp/myfifo
$ grep "xyz somefile > /tmp/myfifo &
$ myCommand /tmp/myfifo
그러나 실제로 첫 번째 솔루션은 더 간단합니다.
스티븐 차제라스(Stephen Chazeras)는 다음과 같이 말했습니다.
zsh에는 일반 임시 파일을 사용하는 myCommand =(grep xyz somefile)도 있습니다(myCommand가 파이프를 허용할 수 없는 경우).
일부 명령은 파이프에는 적용되지 않는 입력 파일에 대한 임의 액세스를 수행할 수 있을 것으로 예상하기 때문에 이는 중요합니다. 이 구문을 사용하면 직접 정리할 필요 없이 임시 파일의 이점을 누릴 수 있습니다.
답변2
이제 대부분의 배포판에는 이러한 목적으로 RAM 디스크가 포함됩니다. 평소대로 파일을 작성할 수 있으며 일반적으로 다음 /dev/shm
과 같이 파일이 있는지 확인할 수 있습니다.
$ mount |grep shm
tmpfs on /dev/shm type tmpfs (rw)
가지고 있다면 다른 파일 시스템처럼 쓸 수 있습니다:
$ echo "hello world" > /dev/shm/somefile.txt
일반 도구를 사용하여 확인하세요.
$ ls -l /dev/shm/
total 680
-r-------- 1 saml saml 67108904 Jul 22 20:55 pulse-shm-3981461026
-r-------- 1 saml saml 67108904 Jul 18 18:06 pulse-shm-799251885
-rw-rw-r-- 1 saml saml 12 Jul 24 10:59 somefile.txt
그러나 이는 실제 디스크 공간을 소비하지 않고 RAM을 사용합니다.