私はDebianでBash 5.1.4を実行しています。
構成やその他のファイルをホームディレクトリの場所にコピーするためのインストール後のスクリプトを作成しています。各ファイルの先頭にプレフィックスを使用して予想されるターゲットを追加しました。 (もちろん、# DEST: $HOME/.config/mousepad/Thunar
スクリプトでは、ファイル名は変数に置き換えられ、ハッシュ記号は適切なコメント文字で置き換えられます。10行前に表示される場合は必ずしも最初の行に表示される必要はないので、shebangsを台無しにする必要はありません)。
これらの場所を取得するには、文字通りを返す次のコマンドを使用head Thunar.acs | egrep "DEST:" | awk '{print $3}
します。私がそれを試してみるとエラーが発生することを意味します。私は読んだ$HOME/.config/Thunar
$HOME
ls $(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)"