Shell

為什麼 xargs 不能正確解析我的輸入?

  • July 17, 2018

我一直在嘗試編寫一個與 cmus 互動的 shell 腳本,然後使用 notify-send 通知我軌道資訊。現在它不起作用,主要是因為 xargs 似乎沒有將 2 個參數傳遞給 notify-send。它只發送一個,我不知道為什麼。我已經用 sed 完成了我能想到的一切以獲得正確的輸出,但它不起作用。另外,如果我使用帶有兩個參數的通知發送,它可以工作,所以我認為通知發送沒有問題。

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

我的程式碼很糟糕。我剛剛開始學習 shell 腳本,對此我感到很抱歉。

#!/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

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-osd發送它通過 Pango 傳遞的消息,因此您需要轉義任何可能被誤認為是 Pango 標記的內容。<>意味著&來處理這個。)

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