Использовать регистратор в скрипте оболочки

Использовать регистратор в скрипте оболочки

Как использовать 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)делает эта строка:

  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

Скорее всего, у вас другая оболочка с /bin/sh, нежели ваша оболочка по умолчанию (вероятно, bash)

Для проверки попробуйте запустить скрипт с помощью /bin/sh ./yourscript или поместите ту же оболочку, что и $SHELL, в свой скрипт

То, какая оболочка используется для /bin/sh, вероятно, зависит от дистрибутива, а если вы используете Solaris, то это что-то совершенно другое.

Связанный контент