| #!/usr/bin/env bash | 
|   | 
| # Try to hardlink a file into a directory, fallback to copy on failure. | 
| # | 
| # Hardlink-or-copy the source file in the first argument into the | 
| # destination directory in the second argument, using the basename in | 
| # the third argument as basename for the destination file. If the third | 
| # argument is missing, use the basename of the source file as basename | 
| # for the destination file. | 
| # | 
| # In either case, remove the destination prior to doing the | 
| # hardlink-or-copy. | 
| # | 
| # Note that this is NOT an atomic operation. | 
|   | 
| set -e | 
|   | 
| main() { | 
|     local src_file="${1}" | 
|     local dst_dir="${2}" | 
|     local dst_file="${3}" | 
|   | 
|     if [ -n "${dst_file}" ]; then | 
|         dst_file="${dst_dir}/${dst_file}" | 
|     else | 
|         dst_file="${dst_dir}/${src_file##*/}" | 
|     fi | 
|   | 
|     mkdir -p "${dst_dir}" | 
|     rm -f "${dst_file}" | 
|     ln -f "${src_file}" "${dst_file}" 2>/dev/null \ | 
|     || cp -f "${src_file}" "${dst_file}" | 
| } | 
|   | 
| main "${@}" |