Во-первых, давайте начнем с параметров командной строки:
-n
отключает нормальный вывод буфера. Только строки, которые требуют распечатать (например, с p
команда), будет распечатан
-r
включает расширенный regexp
-e
не действительно необходим, когда мы указываем команды sed в командной строке а не из файла
Теперь прибывает команды sed. Существуют два, разделены с ;
символ. Sed идет линию за линией и выполняет те две команды в порядке. Но только если они соответствуют. Здесь, обе команды снабжаются префиксом /SOMETHING/
что означает, что эта команда только выполняется, если текущая строка соответствует SOMETHING
regexp.
/jar$/
regexp только соответствует если текущие концы строки jar
. Подобный /class$/
regexp только соответствует если текущие концы строки class
. Теперь, если конкретная строка соответствует, она выполняет две команды в нем (они сгруппированы с {}
) - в первом случае это x
и затем d
команда. Во втором случае это x
и затем p
команда.
x
команда eXchange
. sed
имеет буфер, который можно использовать для хранения некоторых строк. Эта команда обменивается этим буфером с текущей строкой (таким образом, текущая строка переходит к этому содержимому буфера, и содержимое буфера становится текущей строкой).
d
управляйте отбрасывает текущую строку, читает новую и начинает выполнять команды sed от первой (все команды после d
проигнорированы для текущей строки).
p
управляйте печатает текущую строку. Так как мы используем -n
аргументы команды только строки, распечатанные с p
будет показан в выводе.
Таким образом подвести итог:
/jar$/ { x; d; }
средства - если текущие концы строки с jar
, сохраните его в буфере
/class$/ { x; p; }
средства - если текущие концы строки с class
, получите содержимое буфера (который должен содержать последнюю строку, заканчивающуюся jar
, если не был файл, заканчивающийся class
уже) и печать это
Можно попробовать через udev, но это не так легко, более найдено здесь, но знать, что сообщение составляет 4 года гм старые световые годы. USB-устройства, не закрепленные на dev/sd?-> Фиксированный
У меня была аналогичная проблема с USB-устройством, использующим драйвер pl2303. Время от времени /dev/ttyUSB0 исчезал и на его месте появлялся /dev/ttyUSB1.
Я решил эту проблему, выполняя cronjob каждые 15 минут, который делал следующее:
if [ ! -c /dev/ttyUSB0 ]
then
echo `date` Device missing
echo `date` Stopping zmconcopy `/usr/sbin/rczmconcopy stop 2>&1`
sleep 2
echo `date` Unloading drivers `/sbin/modprobe -r pl2303 2>&1`
sleep 2
echo `date` Reloading drivers `/sbin/modprobe pl2303 2>&1`
sleep 2
echo `date` Starting zmconcopy `/usr/sbin/rczmconcopy start 2>&1`
echo `date` Finished
fi
Важно, чтобы любое приложение, использующее /dev/ttyUSB0, останавливалось перед выгрузкой драйвера устройства.
Возможно, вы используете драйвер, отличный от pl2303, поэтому измените его на любой другой.
Вы также можете попробовать использовать устройство по USB-адресу (т. Е. Контроллер / концентратор и номер устройства), например:
ls -l /dev/bus/usb/0??/0??
Вы можете узнать номер устройства с помощью команды LSUSB
( Попробуйте использовать его как root, если вы не получите все необходимую информацию, хотя он обычно имеет тенденцию дать вам довольно много информации) или использовать
udevadm info --name=/dev/ttyUSB0 --attribute-walk
Вот связанная информация, если вы хотите немного выкопать: https://shubuntu.com/questions/184526/how-to-get-bus-and-device-relationships-for-a-dev-ttyusb