구분 기호와 절차적 대체의 차이점은 무엇입니까?

구분 기호와 절차적 대체의 차이점은 무엇입니까?

이 답변에서는 대화형 프로그램의 표준 입력을 구분 기호와 연결하여 구분 기호를 사용하여 대화형 프로그램과 상호 작용하는 방법을 설명합니다.

https://stackoverflow.com/questions/21130757/send-commands-to-socket-using-netcat

"아 파일!"이라고 생각했기 때문에 프로세스 교체를 사용할 수 있습니다!

그래서 나는 다음을 시도했습니다.

nc -lvkp 8000 <(echo "test")

그런 다음 오류가 발생했습니다.

Ncat: Could not resolve hostname "/dev/fd/63

그럼 파일이군요! 그러나 netcat은 그것을 이해하지 못합니다(내가 작성한 일반 파일에서는 그것을 이해합니다 /tmp/commands.txt). netcat이 그것을 이해하지 못한다면 나는 정말로 상관하지 않습니다.

제가 정말 염두에 두는 점은 제가 올바르게 이해했다면 heredoc도 임시 파일이라고 생각한다는 것입니다. 그러나 분명히 netcat은 이것을 이해합니다. 따라서 이것 과 구분 기호 /dev/fd/63사이에는 차이가 있어야 합니다 .

그렇다면 차이점은 무엇입니까?

나는 그것의 일부가 /dev/fd/63영구적이지 않거나 dev/fd부분적으로 다르다고 생각합니다. 그러다가 구분 기호가 거기가 아니라 다른 곳에 저장되어 있다고 생각했습니다.

편집: 은 echo "test""인쇄 단어 테스트"를 의미합니다.

답변1

여기 문서는표준 리디렉션, 프로세스 대체는 표준이 아니지만(따라서 모든 쉘이 이를 지원하는 것은 아님) 리디렉션도 아닙니다.

명시적 프로세스 교체주문 실행특정 경로 이름에서 읽을 수 있고 여기에 문서화된 출력을 생성합니다.텍스트 파일 만들기즉시 리디렉션하세요. 여기 문서가능한이는 임시 파일에 쓰는 방법으로 수행할 수 있지만 명명된 파이프나 유사한 항목에 쓰는 방법으로도 수행할 수 있습니다.

호출은 nc프로세스 대체 결과를 표준 입력 스트림으로 전달하는 것이 아니라 nc명령줄의 파일 이름으로 전달합니다. echo프로세스 대체를 사용하여 표준 입력의 출력을 전달 하려면 다음을 사용하십시오.

nc -lvkp 8000 < <( echo "test" )

<첫 번째 경로가 프로세스 대체에 의해 생성된 경로 이름에서 어떻게 리디렉션되는지 확인하세요 .

이 문서를 사용하여 작성하게 됩니다.

nc -lvkp 8000 <<'END'
test
END

여기 문서에서 특정 경로 이름을 참조하지 않고 리디렉션을 수행하는 방법에 유의하세요. 또한 echo리디렉션된 문서의 텍스트를 생성하기 위해 해당 명령을 사용하지 않는 방법에 유의하세요 .

답변2

여기에 있는 문서는 리디렉션입니다. 쉘은 텍스트를 어딘가에 저장한 다음 명령 입력으로 리디렉션합니다. (정확한 메커니즘은 아닐 수도 있지만, 시스템을 생각하기에는 충분합니다.)

프로세스 대체는 명령의 입력 또는 출력에 대한 경로를 제공합니다.~에프로세스 대체. 그러나 해당 명령 이외의 다른 항목에는 자체적으로 리디렉션을 적용하지 않습니다. 리디렉션 기호( >in >(...)또는 <in <(...))로 인해 다르게 생각하게 되면 내부에 있는 모든 것에 적용된다고 생각하십시오. > 프로세스 대체를 가리키는 것은 다음에 적용됩니다.입력하다내부 명령은 <출력에도 동일하게 적용됨을 나타냅니다. 그들은 아무것도 영향을 미치지 않습니다외부.

따라서:

nc 192.168.1.186 9760 <<END
command1
command2
END

nc입력이 리디렉션되지만

nc -lvkp 8000 <(echo "test")

nc입력은아니요리디렉션. ( echo그러나 의 출력은 프로세스 대체에서 읽은 내용으로 파이프됩니다.) nc추가 인수를 얻습니다.

리디렉션을 직접 적용해야 합니다.

nc -lvkp 8000 < <(echo "test")

답변3

이는 차이점을 강조합니다. wc는 두 경우 모두 동일한 데이터를 봅니다. 먼저 명령줄에서 인수(임시 파일 이름)를 가져옵니다. 두 번째 예에서 파일 이름은 쉘 리디렉션에 의해 사용되고 wc는 인수를 얻지 못하며 기본적으로 stdin을 읽습니다.

Paul--) wc <( echo one two three )
      1       3      14 /dev/fd/63
Paul--) wc < <( echo one two three )
      1       3      14
Paul--) 

답변4

저는 몇 가지 좋은 답변을 읽었지만 제가 작성하려는 답변만큼 간단하지는 않습니다. 따라서 다음과 같습니다.

  • 여기 문서는 <<표준에 연결됩니다.
  • 대체를 처리하려면 <(...)"file"에 연결한 다음 파일 이름을 바꾸십시오.

참고: 파일이라고 하면 Unix 방식으로 사용하는 것입니다. 반드시 디스크에 파일이 있는 것은 아닙니다. 이는 명명된 파이프, 익명 파이프, net-socket, unix-socket 등의 디렉터리일 수 있습니다. 이 경우에는 (익명화되지 않음: 해당 프로세스에만 표시되는 파일 이름이 있음) 연결 대상) 익명 파이프가 됩니다. .

관련 정보