私の 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 が存在する場合と存在しない場合があることに注意してください。
ベストアンサー1
変数var
がユーザーによって入力されたeval
場合、ないチルダを展開するために使用する
eval var=$var # Do not use this!
その理由は、ユーザーが誤って(または意図的に)たとえば入力すると、var="$(rm -rf $HOME/)"
悲惨な結果を招く可能性があるからです。
より良い(そしてより安全な)方法は、Bash パラメータ拡張を使用することです。
var="${var/#\~/$HOME}"