'cmd1 | cmd2'와 'cmd2 <(cmd1)' 및 'mkfifo cmd1>foo'의 차이점은 무엇입니까?

'cmd1 | cmd2'와 'cmd2 <(cmd1)' 및 'mkfifo cmd1>foo'의 차이점은 무엇입니까?

또는: cmd2가 두 가지를 모두 사용할 수 있고 단일 명령인 경우 STDIN이 선호되지 않는 시기와 이유는 무엇입니까?

나는 이 사이트에서 몇 가지 질문을 발견했고 3개의 답변은 위의 각 질문 중 하나였습니다.이것. 이 질문에 대한 첫 번째 답변 변형이 있습니다 mkfifo foo; cmd2 foo; cmd2<foo.

나에게 3가지 관련 답변은 모두 기능적 중복처럼 읽히지만 기본 의미가 약간 다릅니다. 이것을 볼 때마다 마지막 두 답변이 첫 번째 답변을 편집해야 하는 것인지, 아니면 지금까지 깨닫지 못한 정말 중요한 것이 있는 것인지 궁금합니다.

다음은 "로컬 Wireshark를 사용하여 SSH를 통해 원격 네트워크 장치 스니핑"과 관련된 구체적인 예입니다.

선입선출 방식으로,원래 답변(1):

$ mkfifo /tmp/remote; wireshark -k -i /tmp/remote
$ ssh remote "tcpdump -s 0 -U -n -w - <moreOpts>" > /tmp/remote

답변(2) with <(...)(프로세스 대체):

$ wireshark -k -i <(ssh remote tcpdump -s0 -U -n -w - <moreOpts>)

답변(3), 벨트 |(파이프라인):

$ ssh remote tcpdump -U -n -s0 <moreOpts> -w - | wireshark -k -i -

나는 순서대로 읽는 것이 더 쉽다고 생각하기 때문에 일반적으로 cmd1 | cmd2내 사례의 버전을 선택합니다.

세부 사항을 파헤칠 이유가 없었지만 변수, 범위 및 하위 쉘 버퍼링과 관련된 몇 가지 극단적인 경우를 막연하게 기억합니다.

그렇다면 양식 1, 2 또는 3을 사용하지 말아야 하는 극단적인 경우는 무엇입니까?

(1)의 예는 SSH 링크가 불안정한 경우 프로세스를 독립적으로 다시 시작할 수 있다는 것입니다. 그러나 그 외에는 유형 배관이 선호되지 않는 경우에 대한 엄격하고 빠른 규칙을 보거나 찾지 않습니다.

답변1

주요 차이점은 다양한 명령이 실행되는 쉘입니다. 어쨌든, ssh둘 다 wireshark외부 프로세스이므로 어느 것을 사용하든 의미상의 차이는 거의 없습니다.

하나 또는 두 명령이 모두 쉘 명령인 경우 차이점이 더 중요합니다. 를 사용하면 mkfifo두 명령 모두 현재 셸 인스턴스 내에서 실행됩니다. 파이프를 사용하면 두 명령 모두 호출 셸에서 생성된 하위 셸에서 실행됩니다. 현재 쉘에서 시작하려면 프로세스 대체( <(...))를 사용하십시오( 하위 쉘에서).wiresharkssh

이는 변수 변경 사항이 처리되는 방식에 영향을 줄 수 있습니다. 고려하다:

  1. x=0; echo foo | { x=1; cat; }; echo "$x"0 값을 출력합니다 x.
  2. x=0; { x=1; cat; } < <(echo foo); echo "$x"출력 값은 1입니다.x

귀하의 경우에는 프로세스 대체와 같은 비표준 확장이 필요하지 않은 간단한 파이프를 사용합니다.

ssh remote tcpdump -U -n -s0 <moreOpts> -w - | wireshark -k -i -

관련 정보