PIPE(SHELL)で環境変数を拡張する

PIPE(SHELL)で環境変数を拡張する

私が探している形式で答えがあるかもしれないし、ないかもしれない質問がありますが、どんな形式でも十分です。

現在、grepを使用してファイル内の特定の行を検索し、sedを使用して特定の文字の後にあるすべてのテキストを取得するシェルコマンドを使用する設定ファイルがあります。残りのテキストは、環境変数を含むファイルパスです。このコマンドの出力は以下を返します。

$LIGHTS_HOME/音楽/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

このコマンドが実行する操作(読みやすくするために行を編集しました。使用時には1行にする必要があります(必要に応じて複数行を使用することをお勧めします)。

最初の行は grep を使用して 'file_path = $LIGHTS_HOME/music/songname.mp3' 行を返す 'file_path =' 行を探します。

その後、ステートメントを解析し、「=」の後のすべての文字(この場合は「$ LIGHTS_HOME / music / songname.mp3」)を返すsedにパイプします。

そこで、2番目のsedコマンドを使用して$ LIGHTS_HOMEを変数値 '/home/pi/lightshowpi/'に置き換えました。

理想的には、2番目のsedステートメントを削除し、代わりに '$LIGHTS_HOME'を '/home/pi/lightshowpi/'の値として評価することを使用したいと思います。

その後、mp3infoはそれを使用してstdoutでフォーマットされたファイルのメタデータを取得し、xargsにパイプしてメタstdoutをpythonスクリプトで使用されるstdin形式で準備し、その値を他の絵文字と一緒に送信します(Pythonスクリプトはこれを行います)問題はありません)

ただし、/home/pi/lightshowpiを置き換えるために2番目のsedコマンドを使用するよりも$LIGHTS_HOMEを拡張することをお勧めします。他のインストールでは、この変数をホームディレクトリ以外の場所に設定できるためです。

私はこれを端末で試しており、シェルスクリプトに入れるのではないことに注意する必要があるようです。これが状況を変えるかどうかはわかりません。私はまだシェルを学ぶために最善を尽くしていますが、引き続き発生するエラーによって状況が変わることがあると信じています。

ベストアンサー1

(e)ZSHを使用すると、変数で指定されたパラメータ拡張フラグを使用して、「パラメータ拡張、コマンド置換、および算術拡張を実行する」ことができますxzshexpn(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
% 

おすすめ記事