私は次のようなことをする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
または、最初から変数などを入力しない方が良いでしょう。