Я пытаюсь определить, есть ли сетевая ссылка (кабель подключен / отсоединен) в сценарии выскочки (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.) Как это исправить?
Вы должны помнить, что Upstart запускает код оболочки в / bin / sh (это Dash), а не / 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
Итак, есть проблема с синтаксисом. Вместо использования неявного кода состояния, который использует bash, я бы подумал об этом:
/sbin/ethtool eth0 | /bin/grep "Link detected: yes" > /dev/null
if [ $? -eq 0 ]; then echo cheese; fi
Это работает для меня в sh.
[ ! d3]Или вы можете заставить поведение bash обернуть его в загрузчик bash:
script
/bin/bash <<EOT
if [ /sbin/ethtool eth0 | /bin/grep "Link detected: yes" > /dev/null ]; then echo cheese; fi
EOT
end script