1. ホーム
  2. bash

[解決済み] bashで特殊な変数(例: ~チルダ)を手動で展開する方法

2022-04-23 16:50:13

質問

bashスクリプトに次のような値を持つ変数があります。

~/a/b/c

展開されないチルダであることに注意してください。この変数($VARと呼ぶ)に対してls -ltを実行すると、そのようなディレクトリは得られません。この変数を実行せずに、bashに解釈/拡張させたいのです。言い換えれば、bashにevalを実行させたいのですが、評価されたコマンドは実行されません。これはbashで可能ですか?

どのようにして、これを展開せずにスクリプトに渡すことができたのでしょうか?引数を二重引用符で囲んで渡しました。

このコマンドを試してみてください。

ls -lt "~"

これはまさに私が置かれている状況です。チルダを展開させたいのです。つまり、この2つのコマンドを同じにするには、magicを何に置き換えたらいいのでしょうか。

ls -lt ~/abc/def/ghi

そして

ls -lt $(magic "~/abc/def/ghi")

なお、~/abc/def/ghiは存在してもしなくてもかまいません。

どのように解決するのですか?

StackOverflowの性質上、この回答を受け付けないようにすることはできませんが、これを投稿してから5年の間に、私が認めた初歩的でかなり悪い回答よりもはるかに良い回答がありました(私は若かったので殺さないで下さいね)。

このスレッドにある他の解決策は、より安全で優れた解決策です。できれば、この2つのどちらかを選びたいところです。


歴史的な目的のためのオリジナルの回答(ただし、これを使わないでください。)

間違っていなければ "~" は、リテラル文字列として扱われるため、そのような方法でbashスクリプトによって展開されることはありません。 "~" . 強制的に展開するには eval このように

#!/bin/bash

homedir=~
eval homedir=$homedir
echo $homedir # prints home path

または、単に ${HOME} ユーザーのホームディレクトリが必要な場合。