Why does the following bash
check if a directory fail?
if [ ! -d "~/Desktop" ]; then
echo "DOES NOT EXIST"
exit 1;
fi
~/Desktop
does indeed exist. This is on a Mac by the way.
The problem is with this type of script
read -p "Provide the destination directory: " DESTINATION
if [ ! -d $DESTINATION ]; then
echo "\t'$DESTINATION' does not exist." >&2;
exit 1;
fi
Remove the double quotes around the directory to see if it works:
The reason for it is tilde expansion only works when it is unquoted.
info "(bash) Tilde Expansion"
Justin clarified his question in his first comment on quanta's answer. He is reading in a line of text using
read
(or by some other dynamic means) and wants to expand the tilde.The question becomes "How do you perform tilde expansion on the contents of a variable?"
The general approach is to use
eval
, but it comes with some important caveats, namely spaces and output redirection (>
) in the variable. The following seems to work for me:Try it with each of the following inputs:
Explanation
${mypath//>}
strips out>
characters which could clobber a file during theeval
.eval echo ...
is what does the actual tilde expansioneval
are for support of filenames with spaces.As a supplement to this, you can improve the UX by adding the
-e
option to read:Now when the user types in tilde and hits tab, it will expand. This approach does not replace the eval approach above, however, as the expansion only happens if the user hits tab. If he just types in ~/foo and hits enter, it will remain as a tilde.
See also:
It doesn't work not only on Mac but on any platform that runs bash on.
When you quote "~/Desktop" you are telling bash to look for Desktop inside the ~ folder. The quote removes the special purpose of ~
See -- http://www.gnu.org/software/bash/manual/bashref.html#Tilde-Expansion
Remove the double quotes and it should work.
run
use
$HOME
, and make sure the user is actually using the script. if root uses~
its going to look in/root
, not/home/$USER
.should be $HOME instead of ~
~ is a KEYBOARD thing