次のコマンドが見つかりました。
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
すべてのファイルを1行に表示します。だから私は以下を使用しました。
$ 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
出力が1行で構成されていることを確認してください。これは最終的な結果に過ぎず、出力がどのように区別されるかは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に呼び出しごとに1行を読むだけでなく、改行にのみ表示するように指示する必要があります。
upower -e | xargs -d '\n' -L upower -i
または等しく
upower -e | xargs -d '\n' -n 1 upower -i
また、代替テキストを引用する必要はないかもしれません{}
(テキスト自体にスペースが含まれているかどうか)。シェルから中括弧を引用そして文脈で同じ問題を議論するリンクされたコピーfind -exec