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