Я пытаюсь определить, существует ли сетевая ссылка (подключен / отключен кабель) в сценарии запуска (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.) Как это исправить?
Корректный способ сделать это должно использовать
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"
, и это перестало работать.
Необходимо помнить, что Выскочка выполняет код оболочки в/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