install.sh 939 B

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465
  1. #!/bin/sh
  2. #
  3. # This is an actually-safe install command which installs the new
  4. # file atomically in the new location, rather than overwriting
  5. # existing files.
  6. #
  7. usage() {
  8. printf "usage: %s [-D] [-l] [-m mode] src dest\n" "$0" 1>&2
  9. exit 1
  10. }
  11. mkdirp=
  12. symlink=
  13. mode=755
  14. while getopts Dlm: name ; do
  15. case "$name" in
  16. D) mkdirp=yes ;;
  17. l) symlink=yes ;;
  18. m) mode=$OPTARG ;;
  19. ?) usage ;;
  20. esac
  21. done
  22. shift $(($OPTIND - 1))
  23. test "$#" -eq 2 || usage
  24. src=$1
  25. dst=$2
  26. tmp="$dst.tmp.$$"
  27. case "$dst" in
  28. */) printf "%s: %s ends in /\n", "$0" "$dst" 1>&2 ; exit 1 ;;
  29. esac
  30. set -C
  31. set -e
  32. if test "$mkdirp" ; then
  33. umask 022
  34. case "$2" in
  35. */*) mkdir -p "${dst%/*}" ;;
  36. esac
  37. fi
  38. trap 'rm -f "$tmp"' EXIT INT QUIT TERM HUP
  39. umask 077
  40. if test "$symlink" ; then
  41. ln -s "$1" "$tmp"
  42. else
  43. cat < "$1" > "$tmp"
  44. fi
  45. mv "$tmp" "$2"
  46. test -d "$2" && {
  47. rm -f "$2/$tmp"
  48. printf "%s: %s is a directory\n" "$0" "$dst" 1>&2
  49. exit 1
  50. }
  51. test "$symlink" || chmod "$mode" "$2"
  52. exit 0