Назад | Перейти на главную страницу

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

Как я могу использовать регистратор в сценарии оболочки?

Если я сбегу

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) делает:

  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 использует Альмквист Шелл по умолчанию.

Что не так, вы используете bash-ism, пока ваш hash-bang говорит /bin/sh. Измените это на #! /bin/bash и это будет работать.

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

Чтобы проверить, попробуйте запустить сценарий с / bin / sh ./yourscript или поместите ту же оболочку, что и $ SHELL, в свой сценарий.

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