이전에도 잠깐 궁금증이 있어 찾아봤지만, 파이프는 쉽게 말해 이전 명령어의 결과값을 후의 입력값으로 받아들일 수 있게 도와주는 녀석... 정도로 이해했다.
파이프는 데이터가 한 프로세스에서 다른 프로세스로 전달되도록 하는데, 그로 인해 프로세스들의 명령이 스트림에 의해 서로 연결된다(chained)
그래서 이런 프로세스들의 체이닝이 파이프라인(pipeline)으로 표현된다. 👉 명령들이 pipe에 의해서 연결되고, 파이프의 한 쪽 끝에서 다른 쪽 끝으로 데이터가 흐르며 두 프로세스 사이에 데이터가 공유된다.
출처 블로그 : https://architectophile.tistory.com/9
명령어 실습 도중 문제 발생 🚨
폴더 구조:
/home/test/example_dir/subdir
파일 디렉토리 멋있게 올리고 싶은데 저녁먹으러 가야 해서 시간이 없으므로 캡쳐로 떼움
폴더 안에는 이런 파일들이 있었고
ls -R | grep ".txt" | wc -l
ls -R | grep ".txt" | wc -l > txt_file_count_.txt
cat txt_file_count.txt
위의 명령어를 각각 실행하여 결과를 살펴봤다.
첫 번째 명령어의 실행 결과는 당연히 5였고, 두 번째 명령어를 실행한 후 마지막 명령어(cat
)를 실행했을 때 콘솔에 당연히 5가 떠있을 줄 알았다! 하지만 실제로 실행 결과는 다음과 같았다.
어째서...? 6이...?
리눅스와 다시 한 번 멀어지게 됨...
뤼튼ai에게 원인을 설명해달라 했지만 돌아오는 답:
wc -l은 파이프를 통해 전달되는 입력을 처리할 때,
현재 진행 중인 리다이렉션(> txt_file_count.txt)이 완료된 후 결과를 기록하기 때문에,
해당 파일이 추가되어 줄 수에 포함됩니다.
하지만 어째서?! 이전까지는 늘 순차적으로 명령어가 실행되고 저장이 되어 왔는데 왜 리다이렉션이 먼저 실행된 후의 결과를 포함한 wc -l
명령어 결과가 나오는 것인지 전혀 이해할 수 없었다.
마땅히 명확한 답을 얻는 것은 아니다... 난 또 뭐 리다이렉션이 들어가면 무조건? 실행 순서가 변하는 걸까? 생각했는데 아무리 검색해도 확실한 답을 얻을 수는 없었다. 그리고 늘 이런 결과가 나오는 건 또 아닌 것 같다. 그냥 간혹 가다 이런 경우가 생긴다~ 정도로만 알 수 있었음... 속상... 하지만 난 아무리 해도 계속해서 리다이렉션이 먼저 발생하고, 그 뒤에 wc -l이 실행이 됨...
나랑 비슷한 궁금증을 가진 사람도 찾을 수 있었다. 여기도 뭔가 명령어가 납치 >< 되어서 순서가 엉킨다는 느낌을 받으신듯.
하지만 답은 없는 것 같다. 누구도 나에게 시원한 답을 주지 않아!
위의 질문에 달린 답도 이렇고, 뤼튼 ai도 비슷한 답을 주었다.
ls -R | grep ".txt" | wc -l | tee txt_file_count.txt
흐름이 엉키는 것을 애초에 방지하기 위한 명확한 명령어를 작성하는 것이다.
리눅스 명령어는 일반적으로는 입력된 순서대로 작동한다.
하지만 파이프(|
) 와 리다이렉션(>
, >>
)이 사용될 때는 약간의 차이가 있다.
파이프 : 여러 명령어를 연결하여 데이터를 전달한다. 첫 번째 명령어가 실행되면 그 결과가 즉시 두 번째 명령어로 전달되고, 이 과정이 동시에 진행된다.
👉 즉, 처음 명령어의 출력을 기다리지 않고 다음 명령어가 작동한다
리다이렉션 : 명령어의 출력을 파일로 보내는 방식이다. 이 경우, 명령어가 완료된 후에 파일이 생성되거나 수정된다.
👉 그래서 리다이렉션이 포함된 명령어는 출력이 파일로 저장될 때까지 진행된다
이 때문에 리다이렉션이 있는 경우에는 파일이 생성되고 나서 그 파일의 내용이 다음 명령어의 입력으로 포함될 수 있다. 그래서 .txt
파일이 포함된 결과가 생길 수도 있다고 한다.
결론: 명령어들은 입력된 순서대로 진행되지만, 파이프와 리다이렉션이 있을 경우에는 그 결과가 동시에 처리되는 부분이 있다.
근데 이게 출처가 뤼튼ai임... 머쓱... 열심히 물어봄. 근데 확실한 걸까? 잘 모르겠다... 사실 이해한 것 같으면서 이해 못 한 것 같음...
그러던 중 리눅스 명령 실행 원리를 다룬 세 개의 연속 게시물을 봤다.
[리눅스] 명령 실행 원리 2 : 파이프(Pipe('|'))
요기 보면 이런 말이 나옴...! 몇몇 과정은 실행 중에 순서가 뒤바뀔 수도 있다고 하면서 여러 예시(이해 못하겠음)를 보여주고, 이후 리다이렉트에 대한 설명으로 넘어간다... 그럴 수도 있다는 거 겠쥐...?
아직은... 리눅스... 너무 낯설고요... 이해가 잘 안되네요...
머리로 예상하지 못한 결과가 나올 수도 있으니 내가 원하는 결과를 얻을 수 있도록 다양한 명령어를 알아두자! 속 시원한 답을 얻고 글을 적고 싶었는데 여전히 어렵다. 하지만~ 호기심은 충족하지 못했지만~ 오늘은 여기까지만 친해지고 언젠간 이 원리를 다 알 수 있는 날이 오겠지~~ 파이팅... 그래도 리눅스 아직 쬠 싫음
[리눅스] 명령 실행 원리 1 : 파일 디스크립터와 데이터 흐름
[리눅스] 명령 실행 원리 2 : 파이프
[리눅스] 명령 실행 원리 3 : I/O 리다이렉션
리눅스 명령 실행 원리를 다룬 글은 한 번 천천히 읽어봐도 좋을 것 같다. 근데 아직 한 번 봐서는 잘 ... 모르겠음
[리눅스] 표준 스트림과 리다이렉션
[Programming/C] pipe() 함수
명령어 파이프 실행순서 → 비슷한 질문, 궁금증
본 포스팅은 글로벌소프트웨어캠퍼스와 교보DTS가 함께 진행하는 챌린지입니다