![Использовать регистратор в скрипте оболочки](https://rvso.com/image/623627/%D0%98%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D1%82%D1%8C%20%D1%80%D0%B5%D0%B3%D0%B8%D1%81%D1%82%D1%80%D0%B0%D1%82%D0%BE%D1%80%20%D0%B2%20%D1%81%D0%BA%D1%80%D0%B8%D0%BF%D1%82%D0%B5%20%D0%BE%D0%B1%D0%BE%D0%BB%D0%BE%D1%87%D0%BA%D0%B8.png)
Как использовать 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, то это что-то совершенно другое.