임시 데이터용 의사 파일

임시 데이터용 의사 파일

나는 종종 반복적인 방식으로 파일(예: 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

관련 정보