fd1/fd2 대신 fd 3을 소비자에게 파이프하는 방법

fd1/fd2 대신 fd 3을 소비자에게 파이프하는 방법

나는 이런 일을하고 싶습니다 :

echo 'foo' >&3  3|  cat

기본적으로 foo' '를 쓴 3다음 데이터 3cat. 그러나 위의 내용은 작동하지 않습니다.

bash: 3: Bad file descriptor

내가하려는 일을 이해하는 사람이 있습니까?

Node.js의 경우 여기에 작업 예제가 있습니다. https://gist.github.com/ORESoftware/0ad178f4512bbf956e54dd08f2412883

Node.js 요점에서는 이것이 확실해 보입니다. 명령줄에서 다음을 수행합니다.

node foo.js 3> some-file.sh

노드 프로세스에서 우리는 3파일 설명자에 쓰고 있습니다.

하지만 리디렉션 대신 파이프를 사용하여 이 작업을 수행하는 방법을 알고 싶습니다.

이 같은:

node foo.js 3|  cat

답변1

{ echo 'hello on fd3' >&3; } 3>&1 | cat

여기서는 echo표준 출력이 작성되지만 이를 파일 설명자 3으로 리디렉션합니다(이는 wNode 애플리케이션에서 수행하는 쓰기 작업에 해당합니다). 그런 다음 파일 설명자 3의 출력을 표준 출력으로 스트리밍하여 cat.

또한 표준 출력도 삭제합니다.

{ echo 'hello on fd1'; echo 'hello on fd3' >&3; } 3>&1 1>/dev/null | cat

첫 번째는 echo표준 출력에 쓰고 두 번째는 첫 번째 예의 리디렉션을 통해 파일 설명자 3에 씁니다. 파일 설명자 3은 표준 출력으로 전송되며(파이핑 가능) 표준 출력은 삭제됩니다.

in 은 1실제로 필수는 아니며 명확성을 위해 여기에 추가되었습니다.1>/dev/null

두 파이프 모두 hello on fd3출력 전용입니다.

노드 애플리케이션의 경우:

node foo.js 3>&1 | cat

또는 표준 출력도 폐기하려면 다음을 수행하십시오.

node foo.js 3>&1 1>/dev/null | cat

또는 표준 출력을 표준 오류(기본값은 터미널)로 보냅니다.

node foo.js 3>&1 1>&2 | cat

답변2

프로세스 대체나 fd 1과 3 또는 fd 1과 2의 혼합 없이 이 작업을 수행할 수 있습니다.

producer(){ echo to_out; echo >&2 to_err; echo >&3 to_fd3; }
consumer(){ sed "s/^/consumer $@: /" >/dev/tty; }

{ producer 3>&1 >&4 | consumer 3; } 4>&1 | consumer 1
to_err
consumer 1: to_out
consumer 3: to_fd3

{ producer 3>&1 >&4 | consumer 3; } 4>&1
to_out
to_err
consumer 3: to_fd3

답변3

정확히 파이프 별 교체는 아닙니다.

# cmd 3> >(cat)

또는 fd3와 stdout의 출력을 혼합할 수 있다면,

# cmd 3>&1 | cat

답변4

따라서 bash의 경우 다음과 같이 작동합니다.

exec 3<> >(cat > temp.sh)
echo a >&3 # write to it
exec 3>&- # close fd 3.

하지만 이 작업을 수행하는 덜 장황한 방법이 있는지 궁금합니다. 그리고 프로세스 교체 대신 파이프를 사용하세요.

관련 정보