Bash

為什麼管道不適用於 upower -e

  • April 10, 2022

我剛剛找到了這個命令:

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

引用自:https://unix.stackexchange.com/questions/698687