나는 이런 일을하고 싶습니다 :
echo 'foo' >&3 3| cat
기본적으로 foo
' '를 쓴 3
다음 데이터 3
를 cat
. 그러나 위의 내용은 작동하지 않습니다.
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으로 리디렉션합니다(이는 w
Node 애플리케이션에서 수행하는 쓰기 작업에 해당합니다). 그런 다음 파일 설명자 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.
하지만 이 작업을 수행하는 덜 장황한 방법이 있는지 궁금합니다. 그리고 프로세스 교체 대신 파이프를 사용하세요.