실제로 명령 인 가상 파일 작성 파일에서 읽은 것이 실제로 stdout명령

가상 파일을 작성하는 방법이 있습니까? 예를 들어 파일에서 읽은 것이 실제로 stdout명령 에서 읽습니다 . 파일에 쓰는 것이 acually stdin명령에 쓰는 것 입니까?

지금까지 inotifywait파일에서 파일 을 가져와 파일을 수정했습니다.이 파일은 파일이 수정 될 때 명령을 호출하여 파일에서 입력을 받아 다시 씁니다.

inotifywait그래도 계속 다시 시작해야 한다는 것을 좋아하지 않습니다 (그리고 항상 실행되도록해야합니다). 일주일에 두 번만이 파일을 사용합니다.



답변

당신은 명명 된 파이프를 찾고있을 것 입니다.

mkfifo f
{
  echo 'V cebqhpr bhgchg.'
  sleep 2
  echo 'Urer vf zber bhgchg.'
} >f
rot13 < f

파이프에 쓰면 청취 프로그램이 시작되지 않습니다. 루프에서 입력을 처리하려면 청취 프로그램을 계속 실행해야합니다.

while true; do rot13 <f >decoded-output-$(date +%s.%N); done

다중 프로세스 쓰기가 있더라도 파이프에 쓰여진 모든 데이터는 병합됩니다. 여러 프로세스가 읽고있는 경우 하나만 데이터를 가져옵니다. 따라서 파이프는 동시 상황에 적합하지 않을 수 있습니다.

명명 된 소켓은 동시 연결을 처리 할 수 ​​있지만 기본 쉘 스크립트의 기능을 넘어선 것입니다.

규모의 가장 복잡한 끝에있는 사용자 정의 파일 시스템 은 각 파일 시스템 설계 및 장착 할 수 있습니다, open, write, 등의 프로그램에서 함수를 트리거가. 최소 투자는 예를 들어 Python 과 같이 수십 줄의 사소한 코딩 입니다. 파일을 읽을 때만 명령을 실행하려면 scriptfs 또는 fuseflt를 사용할 수 있습니다 .


답변

명명 된 파이프와 관련하여 알아야 할 사항 : 파이프는 파일과 달리 여러 판독기를 가질 수 없습니다. 내용을 읽으면 사라집니다. 따라서 루프를 반복해야합니다. 즉, 라이터에서 파이프로 컨텐츠를 지속적으로 푸시해야합니다.

나는이 질문에 대한 답을 직접 찾고 있었고 내가 찾은 유일한 것은 fuse 기반의 scriptfs 입니다 .


답변

설명하는 것은 본질적으로 FIFO 특수 파일 fifo(7)입니다. 그것들은에 의해 생성되며 mkfifo(1), 프로세스는 Linux 용 R / W에서 프로세스를 열 수 있습니다 (모든 Unixy 시스템이 처리하지는 않습니다). 그러면 두 개의 독립적 인 프로세스가이를 사용하여 통신 할 수 있습니다.


답변

“실제로 명령 인 가상 파일을 작성하는”가장 쉬운 방법은 FUSE 파일 시스템을 확장하는 것입니다. fusepy와 같은 라이브러리를 사용하면 매우 쉽습니다.

다음은 HTTP / HTTPS / FTP 파일을 마치 자신의 Linux 상자에있는 것처럼 읽을 수있는 FUSE 파일 시스템 의 입니다. 마찬가지로 읽을 때 동일한 명령을 실행하는 것을 만들 수 있습니다.

소스 코드 를 보면 거의 50 줄의 코드가 아닙니다 (보일러 플레이트 코드 제외).