xargsが私の入力を正しく解析しないのはなぜですか?

xargsが私の入力を正しく解析しないのはなぜですか?

私はcmusと対話するシェルスクリプトを書いて、通知転送を使ってトラック情報を知らせようとしました。今は動作しません。主に xargs が通知転送に 2 つの引数を渡さないようです。 1つだけ送るのになぜそうなのかわかりません。私は正しい出力を得るためにsedと考えることができるすべてのことをしましたが、うまくいきません。そして、2つのパラメータで通知-送信を使用すると動作するので、通知-送信には問題がないと思います。

cmus-remote -Qの出力は次のとおりです。

status paused
file /home/dennis/music/Coheed And Cambria/GOODAP~1/05 Crossing the Frame.mp3
duration 207
position 120
tag artist Coheed & Cambria
tag album Good Apollo I'm Burning Star IV Volume One: From Fear Through the Eyes of Madness
tag title Crossing the Frame
tag date 2005
tag genre Rock
tag tracknumber 5
tag albumartist Coheed & Cambria
set aaa_mode all
set continue true
set play_library true
set play_sorted false
set replaygain disabled
set replaygain_limit true
set replaygain_preamp 6.000000
set repeat false
set repeat_current false
set shuffle true
set softvol false
set vol_left 100
set vol_right 100

私のコードはひどいです。今、私はシェルのスクリプトを学び始めました。申し訳ありません。

#!/bin/sh
#
# notify of song playing

info="$(cmus-remote -Q)"

title="`echo "$info" | grep 'tag title' | sed "s/'//g" | sed 's/tag title \(.*\)/'\''\1'\''/g'`"

artist="`echo "$info" | grep 'tag artist' | sed "s/'//g" | sed 's/tag artist \(.*\)/ '\''\1/g'`"
album="`echo "$info" | grep 'tag album ' | sed "s/'//g" | sed 's/tag album \(.*\)/ \1'\''/g'`"

stupid="${title}${artist}$album"
echo "$stupid" | xargs notify-send

ベストアンサー1

xargs期待どおりに動作します。各行がパラメータとして使用されます。複数のパラメータが必要な場合は、改行で区切ります。

{echo "$title"; echo "$artist"; echo "$album"} | xargs notify-send

つまり、非常に簡単な作業にあまりにも多くの作業を行っているのです。

title="$(echo "$info" | sed -n 's/^tag title //p')"
artist="$(echo "$info" | sed -n 's/^tag artist //p')"
album="$(echo "$info" | sed -n 's/^tag album //p')"
notify-send "$title" "$artist" "$album"

(別の問題に注意してください: notify-osdPangoを介して転送されたメッセージを送信するため、Pangoタグで誤解される可能性があるすべての項目をエスケープする必要があります。これは実際にはHTMLとXMLのようなものです。上記<>この&問題を処理します。しようとしません)。

おすすめ記事