Как я могу использовать регистратор в сценарии оболочки?
Если я сбегу
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
Что не так в сценарии оболочки?
Shebang верен, поскольку могут использоваться как #! / Bin / sh, так и #! / Bin / bash *, однако, IIRC, вы должны использовать каналы, а не перенаправлять для регистратора, поскольку это программа, а не файл.
Попробуйте этот сценарий:
#!/bin/sh
ntpd -qnp pool.ntp.org 2>&1 |logger
* Если вы используете #! / Bin / sh для своих скриптов, они должны быть совместимы с posix, т. Е. Хорошо работать в Solaris и AIX. Если вы когда-либо используете какие-то специфические особенности bash, необходимо использовать #! / Bin / bash, потому что переносимости больше нет.
Мне действительно пришлось проверить, что за строка ntpd -qnp pool.ntp.org 2> >(logger)
делает:
ntpd -qnp pool.ntp.org
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 использует Альмквист Шелл по умолчанию.
Что не так, вы используете bash-ism, пока ваш hash-bang говорит /bin/sh
. Измените это на #! /bin/bash
и это будет работать.
Скорее всего, у вас другая оболочка с / bin / sh, чем ваша оболочка по умолчанию (возможно, bash)
Чтобы проверить, попробуйте запустить сценарий с / bin / sh ./yourscript или поместите ту же оболочку, что и $ SHELL, в свой сценарий.
Какая оболочка используется для / bin / sh, вероятно, зависит от дистрибутива, плюс, если вы используете Solaris, это нечто совершенно другое.