나는 다음을 시도하고 있습니다
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
- 빈
scr.txt
파일(cat /dev/null > ~/scr.txt
) - (없음) 콘텐츠로
scr6.txt
( ) 덮어쓰기scr.txt
cat ~/scr.txt > ~/scratches/scr6.txt
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