쉘 함수 `>(tee copyError.txt >&2)`의 이름은 무엇입니까?

쉘 함수 `>(tee copyError.txt >&2)`의 이름은 무엇입니까?

stdout 및 stderr을 로그 파일에 기록해야 하지만 화면에는 오류 메시지만 표시됩니다. 나는 이것을 할 수 있다:

cp -rpv a/* b 1> copyLog.txt 2> >(tee copyError.txt >&2) 

웹 어딘가에서 찾았습니다.

>(tee copyError.txt >&2)그냥 이게 뭐라고 불리는지 알고 싶어요 . Google은 꺾쇠 괄호나 괄호와 같은 문자를 무시하기 때문에 Google을 검색할 수 없습니다.

답변1

에서 man bash:

   Process Substitution
       Process substitution is supported  on  systems  that  support
       named  pipes  (FIFOs)  or  the  /dev/fd method of naming open
       files.  It takes the form of <(list) or >(list).  The process
       list  is  run with its input or output connected to a FIFO or
       some file in /dev/fd.  The name of this file is passed as  an
       argument  to  the current command as the result of the expan‐
       sion.  If the >(list) form is used, writing to the file  will
       provide  input  for  list.   If the <(list) form is used, the
       file passed as an argument should be read to obtain the  out‐
       put of list.

검색 문자열을 누르고 입력하여 /맨페이지를 검색 할 수 있으며, 이는 이 정보를 찾는 좋은 방법입니다. 물론 검색할 맨페이지를 알아야 합니다. :)

(하지만 검색할 때 특별한 의미가 있으므로 인용해야 합니다 . bash 맨페이지에서 관련 섹션을 찾으려면 를 입력합니다 />\(.

답변2

>(tee copyError.txt >&2)실제로 몇 가지 다른 기능:

  • >(...)이를 "프로세스 대체"라고 합니다. 그것은명명된 파이프파일 입력 /dev/fd및 이 파일에 대한 쓰기는 괄호 안의 프로세스에 대한 입력을 제공합니다.

  • >: 일반적으로 이를 "출력 리디렉션"이라고 하며 표준 출력( >또는 1>) 또는 표준 오류( 2>)를 파일이나 프로세스로 보낼 수 있습니다. >&2출력 리디렉션이지만 이 경우 출력은 tee표준 오류( &2표준 &1출력) 로 전송됩니다.

  • 그렇지 않은 경우 >대괄호( ())는 서브쉘을 시작합니다. 괄호 안의 명령을 실행하면 해당 명령이 실행되는 동안에만 존재하는 또 다른 쉘이 생성됩니다. 서브셸에서 변수를 선언하면 어떻게 작동하는지 확인할 수 있습니다.

    $ foo='Tom';(foo='Dick'; echo "Sub: $foo"); echo "Orig: $foo"
    Sub: Dick
    Orig: Tom
    

    보시다시피, $foo하위 쉘에 정의된 내용은 상위 쉘에 정의된 내용과 별개입니다.

관련 정보