파이프 명령이 예상대로 작동하지 않습니다. 설명이 필요합니다.

파이프 명령이 예상대로 작동하지 않습니다. 설명이 필요합니다.

나는 다음을 시도하고 있습니다

touch ~/scratches/scr6.txt | cat ~/scr.txt > ~/scratches/scr6.txt | cat /dev/null > ~/scr.txt

scr6.txt가 항상 비어 있는 이유는 모르겠지만 다음을 수행하면 파일이 채워집니다.

cat ~/scr.txt > ~/scratches/scr6.txt

첫 번째 경우가 왜 작동하지 않는지 궁금합니다.

답변1

각 단계를 세분화하면 다음과 같습니다.

  • touch ~/scratches/scr6.txt

    파일이 존재하는 경우 타임스탬프를 지금으로 업데이트합니다. 존재하지 않는 경우 작성하십시오.

  • cat ~/scr.txt > ~/scratches/scr6.txt

    ~/scr.txt를 읽고 내용을 ~scratches/scr6.txt에 씁니다.

  • cat /dev/null > ~/scr.txt

    ~/scr.txt 파일 지우기

주석에서 언급했듯이 명령 사이에는 "|"(PIPE) 대신 "&&"(AND)를 사용하는 것이 더 적절합니다.

답변2

scr.txt좋습니다. 파일에 일부 텍스트가 포함되어 있고 명령을 실행하기 전에 아직 존재하지 않는다는 점을 고려하면 다음과 같습니다 scr6.txt.

touch ~/scratches/scr6.txt | cat ~/scr.txt > ~/scratches/scr6.txt | cat /dev/null > ~/scr.txt
  1. scr.txt파일( cat /dev/null > ~/scr.txt)
  2. (없음) 콘텐츠로 scr6.txt( ) 덮어쓰기scr.txtcat ~/scr.txt > ~/scratches/scr6.txt
  3. scr6.txt이미 존재하므로 아무것도 하지 않음 ( touch ~/scratches/scr6.txt)

그러나 다음 명령은

cat ~/scr.txt > ~/scratches/scr6.txt

scr.txt내용 만 적어주세요scr6.txt

그렇기 때문에 첫 번째 경우 두 파일이 모두 비어 있는 반면 두 번째 경우에는 모든 것이 예상대로 작동합니다.

답변3

내가 이해한 바에 따르면 파이프라인 프로세스는 거의 동시에 시작됩니다. 일반적으로 파이프의 프로세스는 stdin에서 읽거나 stdout에 씁니다(또는 둘 다). I/O 완료에 따라 프로세스가 끝나는 시기가 결정됩니다.

touch출력(예: )이나 표준 입력(예: cat파일 작업 시) 이 없는 프로세스의 경우 일반적으로 프로그램이 파이프 연결을 무시할 것으로 예상합니다.

따라서 기본적으로 세 가지 명령이 병렬로 실행됩니다.

touch ~/scratches/scr6.txt, cat ~/scr.txt > ~/scratches/scr6.txt, 그리고 cat /dev/null > ~/scr.txt.

~/scr.txt가 아직 존재하지 않는 경우 명령 2가 오류와 함께 실패할지 여부는 명령 3과 경쟁 조건에 있으므로 운영 체제에 따라 달라질 수 있습니다. 명령 1과 2도 경쟁 조건에 있지만 경주는 파일의 ctime/mtime/atime에만 영향을 미칩니다.

답변4

간단히 말해서:

touch명령은 새로운 것을 생성하는 방법입니다.빈 파일. 또한 기존 파일과 디렉터리의 타임스탬프(즉, 마지막 액세스 및 수정 날짜와 시간)를 변경하는 데에도 사용됩니다.

첫 번째 명령에서는 scr6.txt.

그러나 두 번째 명령에서는 파일을 생성 하고 모든 것을 해당 파일 scr6.txt에 씁니다 .scr.txt

관련 정보