Команды Bash работают в строке cmd, но не в скрипте - PullRequest
1 голос
/ 21 июля 2010

У меня есть набор команд по конвейеру, которые работают в командной строке, но не выдают вывод при запуске в скрипте.

Команда:

STRNG=$( ip mroute show | tr -d "()," | awk ' {print "/usr/sbin/smcroute -a eth3", $1, $2, "vtun0 vtun1"}' ); echo "$STRNG"`

И выводis:

/usr/sbin/smcroute -a eth3 192.0.1.19 224.1.1.1 vtun0 vtun1
/usr/sbin/smcroute -a eth3 192.0.1.18 224.1.1.1 vtun0 vtun1

Однако, если я добавлю в скрипт ту же самую командную строку, я не получу вывод от команды echo "$STRNG".

Я пытаюсь сделать следующеевыполнить каждую строку в $STRNG как команду, но по какой-либо причине она появляется $STRNG не содержит текста в сценарии, тогда как $STRNG содержит текст при запуске из командной строки.Я уверен, что это из-за ограниченного понимания bash.

Может ли кто-нибудь помочь мне с этим?

Ответы [ 4 ]

1 голос
/ 21 июля 2010

Является ли одна из команд в вашем конвейере псевдонимом?Если это так, вам нужно будет сделать

shopt -s expand_aliases

, чтобы bash расширил его в вашем скрипте .... обычно это включено по умолчанию только в интерактивных оболочках.

0 голосов
/ 22 июля 2010

Я хочу поблагодарить всех за помощь - в будущем это будет полезно для поиска.

Первая строка моего сценария отличалась от командной строки:

/usr/sbin/smcroute -k; /usr/sbin/smcroute -d

Оказывается, я каждый раз получал разные результаты из ip mroute show, возможно, потому что многоадресные пакеты еще не поступали на интерфейс.Добавление sleep 1 после первой строки и до того, как цепочка ip mroute show исправила это.

Я бы не нашел его, если бы не помощь Fosco, и я также не знал, как отлаживать или расширятьпсевдонимы перед.

0 голосов
/ 22 июля 2010

Я бы разбил его на более мелкие части для отладки.

Т.е. сначала есть скрипт, который делает это:

ip mroute show

Запустите скрипт.Если это приводит к выходу, то придерживайтесь большего.

ip mroute show | tr -d "(),"

ip mroute show | tr -d "()," | awk ' {print $0 } '

ip mroute show | tr -d "()," | awk ' {print "/usr/sbin/smcroute -a eth3", $1, $2, "vtun0 vtun1"}'
0 голосов
/ 21 июля 2010

Как сказал Шаррон, запустите его с помощью sh -x.Кроме этого:

  • Является ли ip в сценарии $ PATH?
  • Используете ли вы другой язык ($ LANG или $ LC _ ???) вваш сценарий, поэтому вывод команд переводится на другой язык?
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...