從 PIPE (SHELL) 展開環境變數
我有一個問題,可能有也可能沒有我正在尋找的形式的答案,但任何形式都足夠了。
我目前有一個配置文件,我將在其中使用 shell 命令,使用 grep 在文件中查找特定行,然後使用 sed 獲取特定字元之後的所有文本。剩下的文本只是一個包含環境變數的文件路徑。該命令的輸出返回如下內容:
$LIGHTS_HOME/music/something.mp3
然後我想將它傳送到 mp3info 以從 mp3 文件中獲取可用的元數據。但是,當我將其通過管道傳輸到 mp3info $LIGHTS_HOME 時,它不會擴展到與之相關的實際文件路徑。如何在一行內擴展它?這甚至可能嗎?
這是我目前的命令:
$ sudo grep -w "file_path =" /home/pi/lightshowpi/config/state.cfg | sed 's/.*= //' | sed 's|'\$LIGHTS_HOME'| '/home/pi/lightshowpi'|' | xargs mp3info -p "Now Playing: %t by %a" | xargs sudo python /home/pi/lightshowpi/tweet/tweet.py
命令在做什麼(我已經編輯了該行以便於閱讀,在使用中它需要是單行(最好,如果需要,我可以使用多行):
第一行使用 grep 查找行’file_path =’,返回行’file_path = $LIGHTS_HOME/music/songname.mp3'
然後通過管道傳送到 sed,它解析語句並返回“=”之後的所有字元,在這種情況下返回“$LIGHTS_HOME/music/songname.mp3”
從那裡我使用第二個 sed 命令將 $LIGHTS_HOME 替換為其變數值’/home/pi/lightshowpi/'
理想情況下,我想擺脫第二條 sed 語句,轉而支持將 ‘$LIGHTS_HOME’ 評估為其值 ‘/home/pi/lightshowpi/’ 的東西
然後 mp3info 將使用它來獲取文件的元數據,該元數據被格式化為標準輸出,然後通過管道傳輸到 xargs,xargs 將元標準輸出準備為 python 腳本使用的標準輸入格式,並與其他一些值一起發送推文表情符號(python 腳本沒有問題)
但是,而不是使用第二個 sed 命令替換 $ LIGHTS_HOME for /home/pi/lightshowpi I would rather have $ LIGHTS_HOME 擴展,因為在其他安裝中,此變數可以設置在主目錄以外的其他位置。
我想我應該注意,我在終端中嘗試這個,我沒有把它放在 shell 腳本中。我不確定這是否會改變事情,我仍在盡我所能學習 shell,但我相信這可能會根據我不斷遇到的錯誤改變事情。
本質上,這行程式碼在配置文件 /home/pi/lightshowpi/config/state.cfg 中搜尋“file_path =”行,然後將環境變數 $SYNCHRONIZED_LIGHTS_HOME 擴展為其值並將其通過管道傳輸到 mp3info,後者從中提取元數據然後 MP3 文件將字元串傳送到 Python 腳本,該腳本接受參數並刪除不需要的字元,同時包括來自 Python 表情符號庫的表情符號,以通過 twitters API 向您的帳戶發送推文。
sed '/file_path =/!d;s|.*= ||;s|$SYNCHRONIZED_LIGHTS_HOME|'"$SYNCHRONIZED_LIGHTS_HOME|" /home/pi/lightshowpi/config/state.cfg | xargs mp3info -p "Now Playing %t by %a" | xargs sudo python /home/pi/lightshowpi/tweet/tweet.py
該命令的關鍵是使用 ! 排除 ‘file_path =’ 然後將 xargs 用於 mp3info 和 tweet.py
我將調試以下 /home/pi/lightshowpi/config/state.cfg 使用相同的變數 $SYNCHRONIZED_LIGHTS_HOME 而不是 /home/pi/lightshowpi 以使該命令對這個開源項目通用。
(e)
使用 ZSH,您可以在給定變數中的某些內容上使用參數擴展標誌“執行參數擴展、命令替換和算術擴展”x
(詳情請參閱zshexpn(1)
):x='$HOME/blablah'; echo $x; echo ${(e)x}
或從文件中:
echo '$HOME/fromfile' > afile echo ${(e)$(<afile)}
與 相比,這具有各種優勢
eval
,具體取決於誰可以訪問配置文件以及他們有多頑皮:$ touch somefile $ echo 'hi; rm somefile' > x $ eval "echo `cat x`" hi $ ls somefile ls: somefile: No such file or directory $ exec zsh % touch somefile % echo ${(e)$(<x)} hi; rm somefile % ls somefile somefile %