쉘 스크립트에서 로거 사용

쉘 스크립트에서 로거 사용

쉘 스크립트에서 로거를 어떻게 사용할 수 있습니까?

내가 달리면

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).

  1. 달리다ntpd -qnp pool.ntp.org
  2. stderr을 다음 2>으로 리디렉션합니다. 정확히 어디에 있습니까? 잘....
  3. >(logger)
    1. 명명된 파이프를 생성합니다(참조:기구), 불러라/dev/fd/pipe100
    2. logger해당 파이프에서 STDIN을 읽는 프로세스를 시작합니다.
    3. 이름을 /dev/fd/pipe100명령으로 대체합니다.
  4. ...따라서 실행 중ntpd -qnp pool.ntp.org 2> /dev/fd/pipe100
  5. ...프로세스가 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를 사용하는 경우 완전히 다른 것입니다.

관련 정보