파이프 뒤에 명령 그룹이 오면 정확히 무슨 일이 일어나고 있나요?

파이프 뒤에 명령 그룹이 오면 정확히 무슨 일이 일어나고 있나요?

나는 다음과 같은 표현을 보고 이것이 실제로 무엇을 의미하는지 생각하고 있었습니다. 파이프 기호를 알고 있으며 메인 셸의 중괄호 안에 명령을 실행해야 한다는 것을 command1 | {command2;command3;command4}알고 있지만 그 조합이 무엇을 의미하는지 의아해합니다.{...}

답변1

파이프라인의 부분이 얼마나 복잡한지는 실제로 중요하지 않습니다. 원하는 경우 이를 별도의 스크립트로 시각화할 수 있는 경우가 많습니다(특히 bash서브셸에서 파이프라인의 각 부분을 실행하는 것과 같은 셸에서는 더욱 그렇습니다).

스크립트

command2
command3
command4

... 어느대충( 명목적으로 명령이 서브 쉘에서 실행되지 않는다는 것을 { command2; command3; command4; }고려하지 않고) 다음 의 실행에서 입력이 제공 됩니다.{ ...; }

command1

첫 번째 스크립트의 세 가지 명령이 수행하는 작업에 따라 그 중 하나 또는 여러 개가 의 입력을 소비할 가능성이 높으며 command1, 그 중 하나 또는 여러 개가 출력을 생성하는 경우 파이프라인의 다음 부분으로 이동하거나 터미널 또는 파이프라인의 출력이 리디렉션되는 모든 곳.

답변2

{...}메인 쉘의 중괄호 안의 명령을 실행하도록 강제합니다.

이는 일반적으로 중괄호가 수행하는 작업에 대한 좋은 설명이 아닙니다. 하위 쉘을 생성하지 않는 방식으로 그룹 명령을 중괄호로 묶습니다. 즉, 중괄호 자체는 하위 쉘을 생성하지 않습니다. 중괄호 안의 코드는 항상 하위 쉘에서 실행되는 괄호 안의 코드와 달리 중괄호가 없는 것처럼 동일한 쉘에서 실행됩니다(따라서 리디렉션, 변수, 등은 상위 쉘이나 다른 쉘에 영향을 미치지 않습니다.

중괄호의 요점은 구문에서 단일 명령이 필요한 복잡한 명령을 작성할 수 있도록 하는 것입니다. 예를 들어 command1 | { command2; command3; command4; }(공백과 마지막 세미콜론이 필요함)에서 파이프의 오른쪽은 입니다 { command2; command3; command4; }. 명령은 , then , then 을 { command2; command3; command4; }실행합니다 . 이러한 명령은 모두 파이프에서 입력을 받습니다. (명령이 연속적으로 실행되므로 실행 후 남은 입력을 모두 가져옵니다 .)command2command3command4command3command2

답변3

중괄호를 이름 없는 함수로 생각하세요. 예를 들어

command234 () { command2; command3; command4; }

command1 | command234 

동일한 결과를 제공합니다. 상황이 너무 복잡해지면 그룹 이름을 지정하는 것을 선호합니다. 테스트용이라면.

답변4

표준 출력은 command1표준 입력에서 읽기를 시작하는 명령 블록의 첫 번째 명령에 사용됩니다. 대부분의 경우 이는 command2.

관련 정보