Shell
為什麼 xargs 不能正確解析我的輸入?
我一直在嘗試編寫一個與 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 標記的內容。<
這>
意味著&
來處理這個。)