
私は bash スクリプトを書いていて、その中で次のようなことを行っています。
#!/bin/sh
read -p "Enter target directory: " target_dir
cp some/file.txt $target_dir/exists/for/sure/
このシェル スクリプトを実行すると、次のように表示され、入力されます。
./my_script.sh
Enter target directory: ~/my_dir
しかし、次のエラー/出力が表示されます:
cp: directory ~/my_dir/exists/for/sure/ does not exist
そして、私が明らかにしようとしているように、そのディレクトリは 100% 存在します。つまり、エラーを受信せずに以下を実行できます。
cd ~/my_dir/exists/for/sure/
何が起きてる?
答え1
問題は、~
の入力として入力すると、それが文字通りに解釈され、展開されないことですread
。
試して:
$ read target
~
$ ls $target
ls: cannot access '~': No such file or directory
(引用符に注意してください~
)
eval target=$target # unsafe
またはそれ以上ですが、次のように拡張されます~
。
target="${target/#\~/$HOME}"
あるいは、read
そもそも変数などを入力しないことです。