当我跑步时
$ lsusb -D /dev/bus/usb/001/002
从命令行,它可以工作。但是,当我跑步时
$(lsusb -D /dev/bus/usb/001/002)
我得到了错误
无法打开/ dev / bus / usb / 001/002
在BASH脚本中,我在while循环中运行命令,该循环也从lsusb获取其输入:
while read line; do
if [[ some_condition ]]; then
bus_Num=$(echo "$line" | cut -d' ' -f2)
dev_Num=$(echo "$line" | cut -d' ' -f4)
$(lsusb -D /dev/bus/usb/$bus_Num/$dev_Num)
fi
done < <(lsusb)
但是,当我在循环外运行命令时,它起作用了,这使我相信该< <(lsusb)
命令正在锁定文件。有没有一种方法可以访问文件(也许要确保lsusb以只读方式打开文件),而无需将信息保存到变量中并lsusb -D
在循环结束后运行?
做得好$(lsusb -D /dev/bus/usb/001/002)
是错误的,因为它的输出被扩展为可以作为另一个命令运行,但是Cannot open /dev/bus/usb/001/002
实际上并不是来自输出的错误,而是lsusb
它自身发送的错误消息,因此,除了不使用之外$()
,还必须验证它/dev/bus/usb/001/002
确实存在或活动设备。
我还注意到您的循环很重要。您可能需要使用另一个文件描述符,以确保所有内部命令都不会占用输入内容:
#!/bin/bash
while read -u 4 __ BUS_ID __ DEV_ID __ PV_ID __ NAME; do
DEV_ID=${DEV_ID%%:*} ## Remove the colon.
if [[ $NAME == *something* ]]; then
echo "Trying $NAME"
lsusb -D "/dev/bus/usb/$BUS_ID/$DEV_ID"
fi
done 4< <(exec lsusb)
exec
是可选的。本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句