대시는 스크립트 출력의 자체 리디렉션과 동일합니다.

대시는 스크립트 출력의 자체 리디렉션과 동일합니다.

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

관련 정보