シェル変数のチルダ拡張はどのように機能しますか?

シェル変数のチルダ拡張はどのように機能しますか?

スクリプトのテスト中に興味深い事実を見つけました。

以下を実行すると、シェルで手動で自分のディレクトリを見つけることができます。

$ ls ~/db_backups/
test1  test2
$ 

ただし、チルダを使用してシェル変数にディレクトリの場所を割り当てても機能しません。私は一重引用符と二重引用符を使用してみました。

$ backupfolder='~/db_backups'
$ echo $backupfolder
~/db_backups
$ ls $backupfolder
ls: cannot access '~/db_backups': No such file or directory
$ 

シェル変数内でチルダの置き換えはどうなりますか?ディレクトリ名にチルダを手動で使用するのと同じように、変数でディレクトリが見つからないのはなぜですか?

ベストアンサー1

チルダが変数拡張結果の一部である場合、シェルはbash拡張されません。~引用符なしのチルダプレフィックス(~または現在のユーザー名の場合~+)は、開始または直後にのみ現在のユーザーのホームディレクトリに展開されます。~usernameusername=:/

あなたの場合、変数に割り当てるときに拡張を実行する方が簡単ですbackupfolder。チルダを離すとこうなります。引用しない(一重引用符や二重引用符を使用しないでください):

backupfolder=~/db_backups
ls "$backupfolder"

...または$HOME代わりに使用する場合(単一引用符なし):

backupfolder=$HOME/db_backups
ls "$backupfolder"

両方の割り当てでは、シェルは割り当て演算子の右側の値をdb_backups現在のユーザーのホームディレクトリにある呼び出しパス名に拡張します。

通常、$HOMEスクリプト内で使用する方が簡単で、インタラクティブな~セッションに残すと便利なショートカットとして機能します。このHOME変数は常に次のように動作します。変える

おすすめ記事