$マイ環境変数の拡張(コマンドの置き換え)

$マイ環境変数の拡張(コマンドの置き換え)

私はDebianでBash 5.1.4を実行しています。

構成やその他のファイルをホームディレクトリの場所にコピーするためのインストール後のスクリプトを作成しています。各ファイルの先頭にプレフィックスを使用して予想されるターゲットを追加しました。 (もちろん、# DEST: $HOME/.config/mousepad/Thunarスクリプトでは、ファイル名は変数に置き換えられ、ハッシュ記号は適切なコメント文字で置き換えられます。10行前に表示される場合は必ずしも最初の行に表示される必要はないので、shebangsを台無しにする必要はありません)。

これらの場所を取得するには、文字通りを返す次のコマンドを使用head Thunar.acs | egrep "DEST:" | awk '{print $3}します。私がそれを試してみるとエラーが発生することを意味します。私は読んだ$HOME/.config/Thunar$HOMEls $(head Thunar.acs | egrep "DEST:" | awk '{print $2})ls: cannot access '$HOME/.config/Thunar/': No such file or directoryこの問題選択した回答ですべての二重引用符の組み合わせを試しましたが、まだエラーが発生します。この問題をどのように解決できますか?

変数名を中かっこで囲むことも機能しません。

ありがとうございます!

答え1

コマンド置換と変数拡張は再帰的ではありません。つまり、シェルがまたは$varnameなどの項目を展開すると、他のインスタンスが$(somecommand)拡張されるように結果が検索されません。結果に対して行う唯一のことは、これを「単語」に分割し、ファイル名のワイルドカードのように見える項目を拡張することです。これは他のものよりも多くの問題を引き起こすので、ほぼ常に拡張を二重引用符で囲んで使用する必要があります。影響を受けません。$varname$(somecommand)

実際のホームパスに拡張したい場合は、$HOME私が見た最も簡単な方法はパイプすることですenvsubst(これは環境変数参照のように見えるすべての項目が拡張されますが、次の場合にのみ機能します)。環境エクスポートされていないシェル変数の代わりに変数)または置換がawk行われました(代替として指示された特定の変数のみが実行されます)。

これを行う方法を説明する前に、3つのツール(、headおよびegrep- awk)を使用することに反対して、タスク全体を完全に実行できるようにする必要があります。awk

awk '/DEST:/ {print $3}; (NR>=10) {exit}' Thunar.acs

このビットは元の/DEST:/操作を完了して置き換えます。egrep(NR>=10) {exit}head -n 10

動作バージョンは次のとおりですenvsubst

ls "$(awk '/DEST:/ {print $3}; (NR>=10) {exit}' Thunar.acs | envsubst)"

(単語の分離とワイルドカード拡張が奇妙な操作を実行するのを防ぐには、二重引用符を参照してください。)

awk以下は、sub置換に s 関数を使用するバージョンです。

ls "$(awk -v home="$HOME" '/DEST:/ {sub("\\$HOME",home,$3); print $3}; (NR>=10) {exit}' Thunar.acs)"

関連情報