스크립트 출력의 자체 리디렉션에 해당하는 대시 Bash에서는 현재

Bash에서는 현재 실행중인 스크립트 의 모든 향후 stdout 출력을 리디렉션 할 수 있습니다 . 예를 들어이 스크립트를 사용하면

exec > >(logger -t my-awesome-script)
echo 1
echo 2
echo 3

이것은 syslog에서 끝납니다 :

Oct 26 01:03:16 mybox my-awesome-script[72754]: 1
Oct 26 01:03:16 mybox my-awesome-script[72754]: 2
Oct 26 01:03:16 mybox my-awesome-script[72754]: 3

그러나 이것은 Bash 전용이며 리디렉션이있는 벌거 벗은 exec는 Dash에서 작동하지 않는 것 같습니다.

Syntax error: redirection unexpected

Dash 또는 두 셸에서 어떻게 작동합니까?



답변

당신은 할 수 있습니다 :

{ commands
....
} | logger -t my_awesome_script

아무 쉘에서나 할 수 있습니다.

모양이 마음에 들지 않으면 스크립트를 함수로 감싸십시오.

#!/bin/sh
run() if     [ "$run" != "$$" ] || return
      then   sh -c 'run=$$ exec "$0" "$@"' "$0" "$@" |
             logger -t my-awesome-script
      fi
#script-body
run "$@" || do stuff


답변

명명 된 파이프를 사용하여 공정 대체를 쉽게 시뮬레이션 할 수 있습니다.

mkfifo logger_input
logger -t my_awesome_script < logger_input &
exec > logger_input
echo 1
echo 2
echo 3

실제로 명명 된 파이프는 /dev/fd프로세스 대체가 구현 될 수있는 메커니즘 중 하나입니다 (다른 것 ) bash.


답변

나는 이것이 가능하지 않다고 생각합니다 dash. man페이지 에서 알 수있는 한 프로세스 대체를 지원하지 않습니다.

해결 방법으로 mikserv가 제안한 것을 시도 하거나 모든 것을 파일로 리디렉션 한 다음 스크립트가 완료된 후 (아마도 스크립트에 있음) 해당 파일의 내용을 로거에 추가하십시오.

$ exec > ~/foo/foo.txt
$ ls
$ echo something
$ cat foo/foo.txt | sudo logger -t my-awesome-script


답변