Search code examples
bashmacosshellvariable-expansiontilde-expansion

ln complains about no such file or directory


I'm new in shell programming on macosx and have a little problem. I've written the following shell script:

#!/bin/sh

function createlink {
source_file=$1

target_file="~/$source_file"

if [[ -f $target_file ]]; then
    rm $target_file
fi

ln $source_file $target_file
}

createlink ".netrc"

When I'm executing this script I get the message ln: ~/.netrc: No such file or directory and I don't know why this happened! Do you see the error? Thanks!


Solution

  • The issue is that tilde expansion will not happen as the path is in a variable value (tilde expansion happens before variable expansion). You can ameliorate this issue by using $HOME instead of ~. That is

    target_file="${HOME}/${source_file}"
    

    This should solve your problem.

    Further reading: EXPANSION section of man bash