
나는 종종 반복적인 방식으로 파일(예: wdiff)의 입력을 받아들이는 명령줄 프로그램에 상대적으로 짧은 문자열 데이터(몇 줄 정도)를 제공하고 싶습니다. 물론 하나 이상의 임시 파일을 만들고 거기에 문자열을 저장한 다음 파일 이름을 인수로 사용하여 명령을 실행할 수 있습니다. 그러나 내 생각에는 데이터가 실제로 디스크에 기록된다면 이 프로세스는 매우 비효율적일 것이며, 예를 들어 한 줄의 긴 텍스트를 입력하려는 경우 이 프로세스를 여러 번 반복하면 디스크에 불필요한 해를 끼칠 수 있습니다. . 파일을 wdiff로 저장하세요. 파이프와 같은 의사 파일을 사용하여 데이터를 실제로 디스크에 쓰지 않고 일시적으로 저장하는(또는 임계 길이를 초과할 때만 쓰는) 등 이 문제를 회피할 수 있는 권장 방법이 있습니까? wdiff에는 두 개의 매개변수가 필요합니다. 제가 이해하는 한 이는 wdiff <"text"
.
답변1
command1 <( command0 )
Bash에서는 stdout을 리디렉션 command0
하고 이를 command1
명령줄 인수로 파일 이름 에 전달하는 리디렉션 구문을 사용할 수 있습니다 . 이것은 ... 불리운다프로세스 교체.
파일 이름 명령줄 인수를 사용하는 일부 프로그램에는 실제로 진정한 무작위 액세스 파일이 필요하므로 이 기술은 이러한 프로그램에는 작동하지 않습니다. 그러나 다음을 사용하면 잘 작동합니다 wdiff
.
user@host:/path$ wdiff <( echo hello; echo hello1 ) <( echo hello; echo hello2 )
hello
[-hello1-]
{+hello2+}
뒤에서는 FIFO를 생성하고, 내부 명령을 <( )
FIFO에 파이프하고, FIFO의 파일 설명자를 매개변수로 전달합니다. 무슨 일이 일어나고 있는지 보려면 다음을 사용하여 echo
아무 작업도 수행하지 않고 매개변수를 인쇄해 보세요.
user@host:/path$ echo <( echo hello )
/dev/fd/63
명명된 파이프를 생성하는 것이 더 유연하지만(여러 프로세스를 사용하여 복잡한 리디렉션 논리를 작성하려는 경우) 많은 목적에 충분하고 사용하기 쉽습니다.
>( )
출력으로 사용하려는 경우에 대한 구문 도 있습니다 .
$ someprogram --logfile >( gzip > out.log.gz )
당신은 또한 볼 수 있습니다Bash 매뉴얼 페이지 "프로세스 대체" 섹션그리고Bash 리디렉션 치트 시트관련 기술을 확보하기 위해
답변2
사용하다명명된 파이프. 예를 들어:
mkfifo fifo
echo -e "hello world\nnext line\nline 3" > fifo
-e
개행 문자( )를 올바르게 해석하도록 echo에 지시합니다 \n
. 이는 차단됩니다. 즉, 파이프에서 데이터를 읽을 때까지 쉘이 정지됩니다.
같은 디렉토리 어딘가에 다른 쉘을 엽니다:
cat fifo
다른 쉘을 릴리스하는 에코를 읽으십시오. 파이프는 디스크에 파일 노드로 존재하지만 이를 통과하는 데이터는 모두 메모리에서 발생하지 않습니다. &
에코 배경( )을 설정할 수 있습니다 .
파이프에는 64k 버퍼(Linux)가 있으며 소켓과 마찬가지로 가득 차면 기록기를 차단하므로 기록기를 조기에 종료하지 않는 한 데이터가 손실되지 않습니다.
답변3
wdiff는 2개의 파일 이름 인수가 필요하다는 점에서 특별한 경우이지만, 1개의 인수만 필요하고 파일 이름 인수 이외의 것은 받아들이기를 고집스럽게 거부하는 모든 명령의 경우 2가지 옵션이 있습니다.
파일 이름 "-"(즉, 빼기 기호)는 약 1/2의 시간 동안 작동합니다. 이는 문제의 명령과 명령 개발자가 상황을 파악하여 예상대로 처리했는지 여부에 따라 달라지는 것 같습니다. 예를 들어
$> ls |고양이 -
/dev/stdin이라는 의사 파일은 Linux에 존재하며 명령에 파일 이름이 절대적으로 필요한 경우 사용할 수 있습니다. 이는 특별한 파일 이름 처리를 수행하기 위해 명령이 필요하지 않기 때문에 작동할 가능성이 더 높습니다. fifo가 유효한 경우 또는 bash프로세스 교체방법이 작동하면 이 방법도 작동해야 하며 쉘에 국한되지 않습니다. 예를 들어
$> ls |cat/dev/stdin