我刚刚发现这个命令:
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