~
と$HOME
は現在のユーザーのホームディレクトリを参照していることを知っています。 (私にとってはecho ~
= echo $HOME
= pandya
)。
しかし、bashスクリプトでは使用できません。スクリプトの簡単な例を次に示します。
#!/bin/bash
echo -n "Enter Directory Path:"
read dir1
cd $dir1
しかし、実行されると、次のようにエラーNo such file or directory
が返されます。
$ ./script
Enter Directory Path:~/Desktop
./script: line 4: cd: ~/Desktop: No such file or directory
/home/pandya
の代わりに~
が使用されている場合、動作しています。
$HOME
でも同じ問題。
したがって、このようなbashスクリプトで~
または$HOME
でcd
を適切に使用するにはどうすればよいですか?
evalコマンドを使用して、この問題を解決できます。
#!/bin/bash
echo -n "Enter Directory Path:"
read dir1
eval cd "$dir1"
コードでは$dir1
は~/Desktop
を保存しませんが、/home/user/Desktop
を保存するため、evalコマンドを使用できます。
理解するにはEvalコマンド ここ
動作する例を次に示します。
前述のように、入力からの変数の展開が重要です。
#!/bin/bash
echo -n "Dir:"
read dir1
dir2=`eval echo $dir1`
cd $dir2
pwd
もちろん、スクリプトの実行後に現在のシェルが作業ディレクトリを変更することを期待しないでください。影響を受けません。
問題は、変数展開の前にチルダ展開が発生することです(詳細についてはman bash
を参照)。変数の展開は一度だけなので、$dir1
は展開されますが、その中の文字列$HOME
は展開されません。
read
を使用してコンソールから読み取るのではなく、コマンドライン引数としてディレクトリパスを指定する方が簡単な場合があります。シェルはそれを展開します。
#!/bin/bash
dir1=$1
cd "$dir1"
pwd
そしてそれを
./script ~/Desktop
別の方法は、パスをまったく入力する代わりにファイルダイアログを使用することです。
dialog --dselect / 20 20