Acabei de encontrar este comando:
upower -e
que exibe uma lista de arquivos que podem ser usados upower -i
para exibir o status do dispositivo conectado.
Então, minha primeira tentativa foi usando:
upower -e | xargs upower -i
mas não funciona. Então eu tentei:
$ 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
e exibe todos os arquivos em uma única linha. Então eu usei:
$ 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
funciona, mas exibe uma linha vazia, mas isso não funciona:
$ 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
Por upower -e | xargs upower -i
que não funciona? Estou usando o Bash no Fedora.
Há algo que estou perdendo aqui?
EDITAR :
Isso parece funcionar:
upower -e | xargs -I {} upower -i "{}"
Mas estou me perguntando: por que uma citação é necessária se o nome do arquivo não possui espaços?
upower -e
produz uma lista de caminhos de objeto separados por nova linha.Quando você usou
upower -e | xargs upower -i
, oxargs
comando tokenizou isso no espaço em branco e passou todos os caminhos para uma única invocação deupower -i
, que não conseguiu manipular.Você então tentou
upower -e | xargs echo
, e notou que a saída consistia em uma única linha - isso se resume aecho
isso e não informa como a saídaupower -e
foi delimitada.Em seguida, você tentou
upower -e | xargs -0 echo
, que (já que a saída de nãoupower -e
é delimitada por nulo) passou um único argumento de várias linhas para , que o imprimiu felizmente. Da mesma forma , passou um único caminho de várias linhas para , que, sem surpresa, vomitou.echo
upower -e | xargs -0 upower -i
upower -i
Finalmente você descobriu
upower -e | xargs -I {} upower -i "{}"
. Como-I
implica-L
, isso passou cada linha daupower -e
saída para uma invocação separada deupower -i
. Você poderia ter conseguido o mesmo comEspaço em branco dentro dos caminhos não é um fator aqui, mas se fosse, você deveria dizer ao xargs não apenas para ler uma única linha por invocação, mas também para tokenizá-la apenas em novas linhas:
ou equivalente
Citar o texto de substituição
{}
provavelmente também não é necessário (independentemente de o texto em si conter espaços em branco) - consulte Citar chaves no shell e a duplicata vinculada discutindo o mesmo problema no contexto defind -exec