BASH 8
Install-sh Guest on 30th July 2020 05:21:10 AM
  1. #! /bin/sh
  2. #
  3. # install - install a program, script, or datafile
  4. # This comes from X11R5 (mit/util/scripts/install.sh).
  5. #
  6. # Copyright 1991 by the Massachusetts Institute of Technology
  7. #
  8. # Permission to use, copy, modify, distribute, and sell this software and its
  9. # documentation for any purpose is hereby granted without fee, provided that
  10. # the above copyright notice appear in all copies and that both that
  11. # copyright notice and this permission notice appear in supporting
  12. # documentation, and that the name of M.I.T. not be used in advertising or
  13. # publicity pertaining to distribution of the software without specific,
  14. # written prior permission.  M.I.T. makes no representations about the
  15. # suitability of this software for any purpose.  It is provided "as is"
  16. # without express or implied warranty.
  17. #
  18. # Calling this script install-sh is preferred over install.sh, to prevent
  19. # `make' implicit rules from creating a file called install from it
  20. # when there is no Makefile.
  21. #
  22. # This script is compatible with the BSD install script, but was written
  23. # from scratch.  It can only install one file at a time, a restriction
  24. # shared with many OS's install programs.
  25.  
  26.  
  27. # set DOITPROG to echo to test this script
  28.  
  29. # Don't use :- since 4.3BSD and earlier shells don't like it.
  30. doit="${DOITPROG-}"
  31.  
  32.  
  33. # put in absolute paths if you don't have them in your path; or use env. vars.
  34.  
  35. mvprog="${MVPROG-mv}"
  36. cpprog="${CPPROG-cp}"
  37. chmodprog="${CHMODPROG-chmod}"
  38. chownprog="${CHOWNPROG-chown}"
  39. chgrpprog="${CHGRPPROG-chgrp}"
  40. stripprog="${STRIPPROG-strip}"
  41. rmprog="${RMPROG-rm}"
  42. mkdirprog="${MKDIRPROG-mkdir}"
  43.  
  44. transformbasename=""
  45. transform_arg=""
  46. instcmd="$mvprog"
  47. chmodcmd="$chmodprog 0755"
  48. chowncmd=""
  49. chgrpcmd=""
  50. stripcmd=""
  51. rmcmd="$rmprog -f"
  52. mvcmd="$mvprog"
  53. src=""
  54. dst=""
  55. dir_arg=""
  56.  
  57. while [ x"$1" != x ]; do
  58.     case $1 in
  59.         -c) instcmd="$cpprog"
  60.             shift
  61.             continue;;
  62.  
  63.         -d) dir_arg=true
  64.             shift
  65.             continue;;
  66.  
  67.         -m) chmodcmd="$chmodprog $2"
  68.             shift
  69.             shift
  70.             continue;;
  71.  
  72.         -o) chowncmd="$chownprog $2"
  73.             shift
  74.             shift
  75.             continue;;
  76.  
  77.         -g) chgrpcmd="$chgrpprog $2"
  78.             shift
  79.             shift
  80.             continue;;
  81.  
  82.         -s) stripcmd="$stripprog"
  83.             shift
  84.             continue;;
  85.  
  86.         -t=*) transformarg=`echo $1 | sed 's/-t=//'`
  87.             shift
  88.             continue;;
  89.  
  90.         -b=*) transformbasename=`echo $1 | sed 's/-b=//'`
  91.             shift
  92.             continue;;
  93.  
  94.         *)  if [ x"$src" = x ]
  95.             then
  96.                 src=$1
  97.             else
  98.                 # this colon is to work around a 386BSD /bin/sh bug
  99.                 :
  100.                 dst=$1
  101.             fi
  102.             shift
  103.             continue;;
  104.     esac
  105. done
  106.  
  107. if [ x"$src" = x ]
  108. then
  109.         echo "install:  no input file specified"
  110.         exit 1
  111. else
  112.         true
  113. fi
  114.  
  115. if [ x"$dir_arg" != x ]; then
  116.         dst=$src
  117.         src=""
  118.        
  119.         if [ -d $dst ]; then
  120.                 instcmd=:
  121.         else
  122.                 instcmd=mkdir
  123.         fi
  124. else
  125.  
  126. # Waiting for this to be detected by the "$instcmd $src $dsttmp" command
  127. # might cause directories to be created, which would be especially bad
  128. # if $src (and thus $dsttmp) contains '*'.
  129.  
  130.         if [ -f $src -o -d $src ]
  131.         then
  132.                 true
  133.         else
  134.                 echo "install:  $src does not exist"
  135.                 exit 1
  136.         fi
  137.        
  138.         if [ x"$dst" = x ]
  139.         then
  140.                 echo "install:  no destination specified"
  141.                 exit 1
  142.         else
  143.                 true
  144.         fi
  145.  
  146. # If destination is a directory, append the input filename; if your system
  147. # does not like double slashes in filenames, you may need to add some logic
  148.  
  149.         if [ -d $dst ]
  150.         then
  151.                 dst="$dst"/`basename $src`
  152.         else
  153.                 true
  154.         fi
  155. fi
  156.  
  157. ## this sed command emulates the dirname command
  158. dstdir=`echo $dst | sed -e 's,[^/]*$,,;s,/$,,;s,^$,.,'`
  159.  
  160. # Make sure that the destination directory exists.
  161. #  this part is taken from Noah Friedman's mkinstalldirs script
  162.  
  163. # Skip lots of stat calls in the usual case.
  164. if [ ! -d "$dstdir" ]; then
  165. defaultIFS='   
  166. '
  167. IFS="${IFS-${defaultIFS}}"
  168.  
  169. oIFS="${IFS}"
  170. # Some sh's can't handle IFS=/ for some reason.
  171. IFS='%'
  172. set - `echo ${dstdir} | sed -e '[email protected]/@%@g' -e '[email protected]^%@/@'`
  173. IFS="${oIFS}"
  174.  
  175. pathcomp=''
  176.  
  177. while [ $# -ne 0 ] ; do
  178.         pathcomp="${pathcomp}${1}"
  179.         shift
  180.  
  181.         if [ ! -d "${pathcomp}" ] ;
  182.         then
  183.                 $mkdirprog "${pathcomp}"
  184.         else
  185.                 true
  186.         fi
  187.  
  188.         pathcomp="${pathcomp}/"
  189. done
  190. fi
  191.  
  192. if [ x"$dir_arg" != x ]
  193. then
  194.         $doit $instcmd $dst &&
  195.  
  196.         if [ x"$chowncmd" != x ]; then $doit $chowncmd $dst; else true ; fi &&
  197.         if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd $dst; else true ; fi &&
  198.         if [ x"$stripcmd" != x ]; then $doit $stripcmd $dst; else true ; fi &&
  199.         if [ x"$chmodcmd" != x ]; then $doit $chmodcmd $dst; else true ; fi
  200. else
  201.  
  202. # If we're going to rename the final executable, determine the name now.
  203.  
  204.         if [ x"$transformarg" = x ]
  205.         then
  206.                 dstfile=`basename $dst`
  207.         else
  208.                 dstfile=`basename $dst $transformbasename |
  209.                         sed $transformarg`$transformbasename
  210.         fi
  211.  
  212. # don't allow the sed command to completely eliminate the filename
  213.  
  214.         if [ x"$dstfile" = x ]
  215.         then
  216.                 dstfile=`basename $dst`
  217.         else
  218.                 true
  219.         fi
  220.  
  221. # Make a temp file name in the proper directory.
  222.  
  223.         dsttmp=$dstdir/#inst.$$#
  224.  
  225. # Move or copy the file name to the temp name
  226.  
  227.         $doit $instcmd $src $dsttmp &&
  228.  
  229.         trap "rm -f ${dsttmp}" 0 &&
  230.  
  231. # and set any options; do chmod last to preserve setuid bits
  232.  
  233. # If any of these fail, we abort the whole thing.  If we want to
  234. # ignore errors from any of these, just make sure not to ignore
  235. # errors from the above "$doit $instcmd $src $dsttmp" command.
  236.  
  237.         if [ x"$chowncmd" != x ]; then $doit $chowncmd $dsttmp; else true;fi &&
  238.         if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd $dsttmp; else true;fi &&
  239.         if [ x"$stripcmd" != x ]; then $doit $stripcmd $dsttmp; else true;fi &&
  240.         if [ x"$chmodcmd" != x ]; then $doit $chmodcmd $dsttmp; else true;fi &&
  241.  
  242. # Now rename the file to the real destination.
  243.  
  244.         $doit $rmcmd -f $dstdir/$dstfile &&
  245.         $doit $mvcmd $dsttmp $dstdir/$dstfile
  246.  
  247. fi &&
  248.  
  249.  
  250. exit 0

Paste is for source code and general debugging text.

Login or Register to edit, delete and keep track of your pastes and more.

Raw Paste

Login or Register to edit or fork this paste. It's free.