Upstart: передать вывод нескольких команд

Я пытаюсь определить, существует ли сетевая ссылка (подключен / отключен кабель) в сценарии запуска (Ubuntu 12.04). Вот соответствующая часть моего скрипта (которая не работала):

script
if  [ /sbin/ethtool eth0 | /bin/grep "Link detected: yes" > /dev/null ] ; then
    exec prog1
else
    exec prog2
fi

end script

(попробуйте запустить prog1, если есть ссылка, в противном случае prog2.) Как это исправить?

1
задан 4 June 2014 в 18:12

2 ответа

Корректный способ сделать это должно использовать

if /sbin/ethtool eth0 | /bin/grep -q "Link detected: yes" ; then
    exec prog1
else
    exec prog2
fi

,-q аргумент grep отбросит stdout, и, если оператор проверит состояние команды, это работает. [ /sbin/ethtool eth0 | /bin/grep -q "Link detected: yes" ] не допустимая команда, потому что [ на самом деле программа, которая принимает аргументы как grep. Так [ не может понять /sbin/ethtool eth0 | /bin/grep -q "Link detected: yes", и это перестало работать.

2
ответ дан 4 June 2014 в 18:12

Необходимо помнить, что Выскочка выполняет код оболочки в/bin/sh (который является Тире), не/bin/bash. При помещении кода в sh он не работает:

$ if  [ /sbin/ethtool eth0 | /bin/grep "Link detected: yes" > /dev/null ]; then echo cheese; fi
sh: 9: [: missing ]
/bin/grep: ]: No such file or directory

, Таким образом, существует проблема синтаксиса там. Вместо того, чтобы использовать неявный код состояния проверяют, что удар использует, я рассмотрел бы разбивающиеся вещи как так:

/sbin/ethtool eth0 | /bin/grep "Link detected: yes" > /dev/null
if  [ $? -eq 0 ]; then echo cheese; fi

вышеупомянутые работы для меня в sh.

<час>

Или Вы могли вызвать поведение удара обертывание его в загрузчике удара :

script
/bin/bash <<EOT
    if  [ /sbin/ethtool eth0 | /bin/grep "Link detected: yes" > /dev/null ]; then echo cheese; fi
EOT
end script
0
ответ дан 4 June 2014 в 18:12

Другие вопросы по тегам:

Похожие вопросы: