
쉘 스크립트에서 로거를 어떻게 사용할 수 있습니까?
내가 달리면
ntpd -qnp pool.ntp.org 2> >(logger)
콘솔에서는 예상대로 작동합니다.
쉘 스크립트에 넣으면
#!/bin/sh
ntpd -qnp pool.ntp.org 2> >(logger)
다음과 같은 오류가 발생합니다.
line 2: syntax error: unexpected redirection
exited with code 2
쉘 스크립트에 어떤 문제가 있나요?
답변1
#!/bin/sh 및 #!/bin/bash를 모두 사용할 수 있으므로 shebang은 정확합니다*. 그러나 IIRC에서는 파일이 아닌 프로그램이므로 로거용으로 리디렉션되지 않는 파이프를 사용해야 합니다.
다음 스크립트를 사용해 보세요.
#!/bin/sh
ntpd -qnp pool.ntp.org 2>&1 |logger
*스크립트에 #!/bin/sh를 사용하는 경우 posix와 호환되어야 합니다. 즉, Solaris 및 AIX에서 잘 실행됩니다. bash 특정 기능을 사용하는 경우 더 이상 이식성이 없으므로 #!/bin/bash를 사용해야 합니다.
답변2
문제는 hash-bang이 이라고 말하는 동안 bash-ism을 사용하고 있다는 것입니다 /bin/sh
. 로 변경 #! /bin/bash
하면 작동됩니다.
답변3
실제로 그 줄이 무엇을 하는지 확인해야 했습니다 ntpd -qnp pool.ntp.org 2> >(logger)
.
- 달리다
ntpd -qnp pool.ntp.org
- stderr을 다음
2>
으로 리디렉션합니다. 정확히 어디에 있습니까? 잘.... >(logger)
- 명명된 파이프를 생성합니다(참조:기구), 불러라
/dev/fd/pipe100
logger
해당 파이프에서 STDIN을 읽는 프로세스를 시작합니다.- 이름을
/dev/fd/pipe100
명령으로 대체합니다.
- 명명된 파이프를 생성합니다(참조:기구), 불러라
- ...따라서 실행 중
ntpd -qnp pool.ntp.org 2> /dev/fd/pipe100
- ...프로세스가
logger
해당 파이프에서 읽는 동안:logger < /dev/fd/pipe100
위의 내용은 bash에서 잘 작동합니다.
그러나 명시적으로 "sh"를 사용하여 실행하려고 시도했는데 결과는 다음과 같습니다.
script.sh: line 3: syntax error near unexpected token `>'
따라서 다른 논평자가 언급했듯이 여기서는 bash를 사용하지 않을 것입니다.
실제로 Busybox는알름퀴스트 껍질기본적으로.
답변4
기본 쉘(아마도 bash)과 /bin/sh가 있는 다른 쉘이 있을 가능성이 높습니다.
확인하려면 /bin/sh ./yourscript를 사용하여 스크립트를 실행하거나 $SHELL과 동일한 쉘을 스크립트에 넣으십시오.
/bin/sh에 사용되는 쉘은 아마도 배포판에 따라 다르며 Solaris를 사용하는 경우 완전히 다른 것입니다.