bash:无法用命令打开文件

时间:2014-07-22 10:41:39

标签: bash file-io command-line

当我跑步时

$ 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

2 个答案:

答案 0 :(得分:1)

运行some_command时,它会执行命令并将命令的标准输出发送到终端(除非重定向)。

运行$(some_command)时,它会执行命令并捕获命令的标准输出,并将其返回给您。通常,您将该输出存储在变量(var=$(some_command))中。由于您没有存储输出,命令的输出将作为exectute 的命令返回给shell

示例:

$ echo "echo foo"
echo foo
$ $(echo "echo foo")
foo

答案 1 :(得分:0)

做好$(lsusb -D /dev/bus/usb/001/002)是错误的,因为它的输出被扩展为另一个命令运行但是Cannot open /dev/bus/usb/001/002实际上不是来自被调用的输出的错误,而是由{{1}发送的错误消息}本身除了不使用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) 只是可选的。