Bash에서는 모두 리디렉션할 수 있습니다.미래표준 출력으로 출력현재 실행 중스크립트. 예를 들어 이 스크립트를 사용하면
exec > >(logger -t my-awesome-script)
echo 1
echo 2
echo 3
이는 시스템 로그에 기록됩니다.
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에만 해당되며 리디렉션이 포함된 기본 실행 프로그램은 Dash에서 작동하지 않는 것 같습니다.
Syntax error: redirection unexpected
Dash 또는 두 셸 모두에서 작동하게 하려면 어떻게 해야 하나요?
답변1
다음을 수행할 수 있습니다.
{ 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
답변2
명명된 파이프를 사용하여 프로세스 교체를 쉽게 시뮬레이션할 수 있습니다.
mkfifo logger_input
logger -t my_awesome_script < logger_input &
exec > logger_input
echo 1
echo 2
echo 3
실제로 명명된 파이프는 /dev/fd
.NET에서 프로세스 교체를 구현할 수 있는 메커니즘 중 하나입니다(다른 하나는) bash
.
답변3
dash
내가 아는 한 그것은 에 있다고 생각한다 .man
페이지, 이는 프로세스 교체를 지원하지 않습니다.
해결 방법으로 시도할 수 있는 작업Mikesell이 제안한또는 모든 것을 파일로 리디렉션한 다음 스크립트가 완료된 후(아마도 스크립트 내에서) 해당 파일의 내용을 로거에 추가할 수 있습니다.
$ exec > ~/foo/foo.txt
$ ls
$ echo something
$ cat foo/foo.txt | sudo logger -t my-awesome-script