为什么管道不能与 upower -e 一起使用

为什么管道不能与 upower -e 一起使用

我刚刚发现这个命令:

upower -e

upower -i显示可用于显示插入设备状态的文件列表。

所以我的第一次尝试是使用:

upower -e | xargs upower -i

但它不起作用。所以我尝试过:

$ upower -e | xargs echo
/org/freedesktop/UPower/devices/line_power_AC /org/freedesktop/UPower/devices/battery_BAT0 /org/freedesktop/UPower/devices/line_power_ucsi_source_psy_USBC000o001 /org/freedesktop/UPower/devices/DisplayDevice

它以单行显示所有文件。所以我用过:

$ upower -e | xargs -0 echo
/org/freedesktop/UPower/devices/line_power_AC
/org/freedesktop/UPower/devices/battery_BAT0
/org/freedesktop/UPower/devices/line_power_ucsi_source_psy_USBC000o001
/org/freedesktop/UPower/devices/DisplayDevice

它可以工作,但显示一个空行,但这不起作用:

$ upower -e | xargs -0 upower -i
failed to set path: Object path invalid: /org/freedesktop/UPower/devices/line_power_AC
/org/freedesktop/UPower/devices/battery_BAT0
/org/freedesktop/UPower/devices/line_power_ucsi_source_psy_USBC000o001
/org/freedesktop/UPower/devices/DisplayDevice

为什么upower -e | xargs upower -i不起作用?我在 Fedora 上使用 Bash。

我在这里缺少什么吗?

编辑

这似乎有效:

upower -e | xargs -I {} upower -i "{}"

但我想知道:如果文件名没有空格,为什么需要引号?

答案1

upower -e生成一个以换行符分隔的对象路径列表。

当您使用 时upower -e | xargs upower -i,该xargs命令会在空格上标记它,并将所有路径传递给 的单个调用upower -i,但它无法处理。

然后,您尝试了upower -e | xargs echo,并注意到输出由一行组成 - 这只是最后的结果echo,并且没有告诉您 的输出upower -e是如何定界的。

接下来你尝试了upower -e | xargs -0 echo,其中(因为 的输出upower -e不是null 分隔)将一个多行参数传递给echo,它很高兴地打印了它。同样,upower -e | xargs -0 upower -i将一条多线路径传递给upower -i,不出所料,它就崩溃了。

终于你发现了upower -e | xargs -I {} upower -i "{}"。由于-I意味着-L,这通过了每个线upower -e输出到单独的调用upower -i。你也可以达到同样的效果

upower -e | xargs -L upower -i

空白之内路径不是这里的一个因素,但如果是的话,您应该告诉 xargs 不仅每次调用读取一行,而且还仅在换行符上对其进行标记:

upower -e | xargs -d '\n' -L upower -i

或同等地

upower -e | xargs -d '\n' -n 1 upower -i

引用替换文本{}可能也没有必要(无论文本本身是否包含空格) - 请参阅在 shell 中引用大括号以及链接的副本在上下文中讨论同一问题find -exec

相关内容