cp コマンドはディレクトリが存在しないと表示しますが、実際には存在します

cp コマンドはディレクトリが存在しないと表示しますが、実際には存在します

私は 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そもそも変数などを入力しないことです。

関連情報