이와 같은 표현을 보고 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; }
실행합니다 . 이러한 모든 명령은 파이프에서 입력을 받습니다. (명령이 계속 실행되므로 실행 후 남은 입력을 얻는 등의 작업이 수행됩니다.)command2
command3
command4
command3
command2
답변3
중괄호를 이름 없는 함수로 처리합니다. 예를 들어
command234 () { command2; command3; command4; }
command1 | command234
동일한 결과를 제공합니다. 상황이 너무 복잡해지면 이름이 지정된 그룹을 선호합니다. 테스트용이라면.
답변4
표준 출력은 command1
표준 입력에서 읽기를 시작하는 명령 블록의 첫 번째 명령에 사용됩니다. 대부분의 경우 이는 command2
.