install.sh raw

   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  
   8  usage() {
   9  printf "usage: %s [-D] [-l] [-m mode] src dest\n" "$0" 1>&2
  10  exit 1
  11  }
  12  
  13  mkdirp=
  14  symlink=
  15  mode=755
  16  
  17  while getopts Dlm: name ; do
  18  case "$name" in
  19  D) mkdirp=yes ;;
  20  l) symlink=yes ;;
  21  m) mode=$OPTARG ;;
  22  ?) usage ;;
  23  esac
  24  done
  25  shift $(($OPTIND - 1))
  26  
  27  test "$#" -eq 2 || usage
  28  src=$1
  29  dst=$2
  30  tmp="$dst.tmp.$$"
  31  
  32  case "$dst" in
  33  */) printf "%s: %s ends in /\n", "$0" "$dst" 1>&2 ; exit 1 ;;
  34  esac
  35  
  36  set -C
  37  set -e
  38  
  39  if test "$mkdirp" ; then
  40  umask 022
  41  case "$2" in
  42  */*) mkdir -p "${dst%/*}" ;;
  43  esac
  44  fi
  45  
  46  trap 'rm -f "$tmp"' EXIT INT QUIT TERM HUP
  47  
  48  umask 077
  49  
  50  if test "$symlink" ; then
  51  ln -s "$1" "$tmp"
  52  else
  53  cat < "$1" > "$tmp"
  54  chmod "$mode" "$tmp"
  55  fi
  56  
  57  mv -f "$tmp" "$2"
  58  test -d "$2" && {
  59  rm -f "$2/$tmp"
  60  printf "%s: %s is a directory\n" "$0" "$dst" 1>&2
  61  exit 1
  62  }
  63  
  64  exit 0
  65