또는: 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
$ wireshark -k -i <(ssh remote tcpdump -s0 -U -n -w - <moreOpts>)
$ ssh remote tcpdump -U -n -s0 <moreOpts> -w - | wireshark -k -i -
나는 순서대로 읽는 것이 더 쉽다고 생각하기 때문에 일반적으로 cmd1 | cmd2
내 사례의 버전을 선택합니다.
세부 사항을 파헤칠 이유가 없었지만 변수, 범위 및 하위 쉘 버퍼링과 관련된 몇 가지 극단적인 경우를 막연하게 기억합니다.
그렇다면 양식 1, 2 또는 3을 사용하지 말아야 하는 극단적인 경우는 무엇입니까?
(1)의 예는 SSH 링크가 불안정한 경우 프로세스를 독립적으로 다시 시작할 수 있다는 것입니다. 그러나 그 외에는 유형 배관이 선호되지 않는 경우에 대한 엄격하고 빠른 규칙을 보거나 찾지 않습니다.
답변1
주요 차이점은 다양한 명령이 실행되는 쉘입니다. 어쨌든, ssh
둘 다 wireshark
외부 프로세스이므로 어느 것을 사용하든 의미상의 차이는 거의 없습니다.
하나 또는 두 명령이 모두 쉘 명령인 경우 차이점이 더 중요합니다. 를 사용하면 mkfifo
두 명령 모두 현재 셸 인스턴스 내에서 실행됩니다. 파이프를 사용하면 두 명령 모두 호출 셸에서 생성된 하위 셸에서 실행됩니다. 현재 쉘에서 시작하려면 프로세스 대체( <(...)
)를 사용하십시오( 하위 쉘에서).wireshark
ssh
이는 변수 변경 사항이 처리되는 방식에 영향을 줄 수 있습니다. 고려하다:
x=0; echo foo | { x=1; cat; }; echo "$x"
0 값을 출력합니다x
.x=0; { x=1; cat; } < <(echo foo); echo "$x"
출력 값은 1입니다.x
귀하의 경우에는 프로세스 대체와 같은 비표준 확장이 필요하지 않은 간단한 파이프를 사용합니다.
ssh remote tcpdump -U -n -s0 <moreOpts> -w - | wireshark -k -i -