bash:无法使用命令打开文件

先生用户

当我跑步时

$ 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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章