為什麼管道不適用於 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 "{}"
但我想知道:如果文件名沒有空格,為什麼需要引號?
upower -e
生成一個以換行符分隔的對象路徑列表。當您使用
upower -e | xargs upower -i
時,該命令在空格上對其進行標記,並將所有路徑傳遞給它無法處理xargs
的單個呼叫。upower -i
然後您嘗試
upower -e | xargs echo
了,並註意到輸出由單行組成 -echo
雖然如此,但並沒有告訴您的輸出upower -e
是如何分隔的。接下來你嘗試
upower -e | xargs -0 echo
了 ,它(因為 的輸出upower -e
不是空分隔的)將單個多行參數傳遞給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