web-dev-qa-db-ja.com

bashスクリプトで「〜」または「$ HOME」を指定したcdコマンドの使用に関する問題

~$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スクリプトで~または$HOMEcdを適切に使用するにはどうすればよいですか?

5
Pandya

evalコマンドを使用して、この問題を解決できます。

#!/bin/bash
echo -n "Enter Directory Path:"
read dir1
eval cd "$dir1"

コードでは$dir1~/Desktopを保存しませんが、/home/user/Desktopを保存するため、evalコマンドを使用できます。

理解するにはEvalコマンド ここ

5
nux

動作する例を次に示します。

前述のように、入力からの変数の展開が重要です。

#!/bin/bash
echo -n "Dir:"
read dir1
dir2=`eval echo $dir1`
cd $dir2
pwd

もちろん、スクリプトの実行後に現在のシェルが作業ディレクトリを変更することを期待しないでください。影響を受けません。

3
Run CMD

問題は、変数展開の前にチルダ展開が発生することです(詳細についてはman bashを参照)。変数の展開は一度だけなので、$dir1は展開されますが、その中の文字列$HOMEは展開されません。

readを使用してコンソールから読み取るのではなく、コマンドライン引数としてディレクトリパスを指定する方が簡単な場合があります。シェルはそれを展開します。

#!/bin/bash
dir1=$1
cd "$dir1"
pwd

そしてそれを

./script ~/Desktop

別の方法は、パスをまったく入力する代わりにファイルダイアログを使用することです。

dialog --dselect / 20 20
2
choroba