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