stdout
파일에서 읽는 것이 실제로 명령 에서 읽히도록 더미 파일을 만드는 방법이 있습니까 stdin
?
지금까지 나는 inotifywait
이것을 파일이 수정될 때 명령을 호출하고 파일에서 입력을 받아 파일에 다시 쓰는 파일의 하나와 결합했습니다.
나는 계속해서 재부팅하는 것을 좋아하지 않습니다 inotifywait
(그리고 항상 실행되도록 해야 합니다). 저는 이 파일을 일주일에 두 번 정도만 사용합니다.
답변1
당신은 찾고있을 수 있습니다명명된 파이프.
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
등이 프로그램에서 기능을 트리거하는 파일 시스템을 설계하고 설치할 수 있습니다 . 최소한의 투자는 수십 줄의 사소하지 않은 코딩입니다.파이썬. 파일을 읽는 동안에만 명령을 실행하려면 다음을 사용할 수 있습니다.스크립트 파일 시스템또는퓨즈.
답변2
명명된 파이프에 대해 주의할 사항: 파일과 달리 파이프는 여러 판독기를 가질 수 없습니다. 내용을 읽은 후에는 사라집니다. 따라서 루프가 필요합니다. 즉, 작성자의 콘텐츠를 파이프라인으로 지속적으로 푸시해야 합니다.
나는 이 질문에 대한 답을 스스로 찾고 있었는데, 내가 생각할 수 있는 유일한 것은스크립트 파일 시스템이는 다음을 기반으로 합니다.퓨즈.
답변3
설명하는 내용은 본질적으로 FIFO 특수 파일입니다 fifo(7)
. 을 참조하세요. 생성된 mkfifo(1)
다음 프로세스는 Linux에서 읽기/쓰기를 위해 이를 열 수 있습니다(모든 Unixy 시스템이 이를 처리할 수 있는 것은 아닙니다). 그러면 두 개의 독립적인 프로세스가 이를 사용하여 통신할 수 있습니다.
답변4
질문이 모호합니다. stdin/stdout은 파이프/스트림입니다. 파일은 무작위로 액세스됩니다. 즉, 파일에 액세스할 때 오프셋이 포함되며 이를 stdin/stdout을 통해 명령에 전달할 방법이 없습니다.
주소가 없는 파이프/스트림 동작을 정말로 원한다면 명명된 파이프를 사용하거나 "socat"을 사용하여 가상 터미널(pty)을 설정하십시오. 그러면 명령이 상대방의 말을 듣고 응답합니다. 그러나 해당 파일에 액세스하는 모든 작업은 직렬 장치로 수행되어야 합니다. Linux의 파일 경로가 어떻게 단순히 "스트림/파이프"로 액세스될 수 있는지 잘 모르겠습니다. 예를 들어, "cat" 명령은 실제로 프로그래밍 방식으로 파일을 열지만 세부 사항은 확실하지 않지만 주소가 포함되므로 일반 파일 시스템 파일처럼 열지는 않을 것 같습니다.
무작위 액세스가 필요한 경우 NBD, NBDkit, libFUSE, BUSE, scriptfs, python-fuse를 살펴보세요.