Offset 0, 0 lines modifiedOffset 1, 541 lines modified
 1 #!/bin/sh
 2 #·install·-·install·a·program,·script,·or·datafile
  
 3 scriptversion=2020-11-14.01;·#·UTC
  
 4 #·This·originates·from·X11R5·(mit/util/scripts/install.sh),·which·was
 5 #·later·released·in·X11R6·(xc/config/util/install.sh)·with·the
 6 #·following·copyright·and·license.
 7 #
 8 #·Copyright·(C)·1994·X·Consortium
 9 #
 10 #·Permission·is·hereby·granted,·free·of·charge,·to·any·person·obtaining·a·copy
 11 #·of·this·software·and·associated·documentation·files·(the·"Software"),·to
 12 #·deal·in·the·Software·without·restriction,·including·without·limitation·the
 13 #·rights·to·use,·copy,·modify,·merge,·publish,·distribute,·sublicense,·and/or
 14 #·sell·copies·of·the·Software,·and·to·permit·persons·to·whom·the·Software·is
 15 #·furnished·to·do·so,·subject·to·the·following·conditions:
 16 #
 17 #·The·above·copyright·notice·and·this·permission·notice·shall·be·included·in
 18 #·all·copies·or·substantial·portions·of·the·Software.
 19 #
 20 #·THE·SOFTWARE·IS·PROVIDED·"AS·IS",·WITHOUT·WARRANTY·OF·ANY·KIND,·EXPRESS·OR
 21 #·IMPLIED,·INCLUDING·BUT·NOT·LIMITED·TO·THE·WARRANTIES·OF·MERCHANTABILITY,
 22 #·FITNESS·FOR·A·PARTICULAR·PURPOSE·AND·NONINFRINGEMENT.··IN·NO·EVENT·SHALL·THE
 23 #·X·CONSORTIUM·BE·LIABLE·FOR·ANY·CLAIM,·DAMAGES·OR·OTHER·LIABILITY,·WHETHER·IN
 24 #·AN·ACTION·OF·CONTRACT,·TORT·OR·OTHERWISE,·ARISING·FROM,·OUT·OF·OR·IN·CONNEC-
 25 #·TION·WITH·THE·SOFTWARE·OR·THE·USE·OR·OTHER·DEALINGS·IN·THE·SOFTWARE.
 26 #
 27 #·Except·as·contained·in·this·notice,·the·name·of·the·X·Consortium·shall·not
 28 #·be·used·in·advertising·or·otherwise·to·promote·the·sale,·use·or·other·deal-
 29 #·ings·in·this·Software·without·prior·written·authorization·from·the·X·Consor-
 30 #·tium.
 31 #
 32 #
 33 #·FSF·changes·to·this·file·are·in·the·public·domain.
 34 #
 35 #·Calling·this·script·install-sh·is·preferred·over·install.sh,·to·prevent
 36 #·'make'·implicit·rules·from·creating·a·file·called·install·from·it
 37 #·when·there·is·no·Makefile.
 38 #
 39 #·This·script·is·compatible·with·the·BSD·install·script,·but·was·written
 40 #·from·scratch.
  
 41 tab='»  '
 42 nl='
 43 '
 44 IFS="·$tab$nl"
  
 45 #·Set·DOITPROG·to·"echo"·to·test·this·script.
  
 46 doit=${DOITPROG-}
 47 doit_exec=${doit:-exec}
  
 48 #·Put·in·absolute·file·names·if·you·don't·have·them·in·your·path;
 49 #·or·use·environment·vars.
  
 50 chgrpprog=${CHGRPPROG-chgrp}
 51 chmodprog=${CHMODPROG-chmod}
 52 chownprog=${CHOWNPROG-chown}
 53 cmpprog=${CMPPROG-cmp}
 54 cpprog=${CPPROG-cp}
 55 mkdirprog=${MKDIRPROG-mkdir}
 56 mvprog=${MVPROG-mv}
 57 rmprog=${RMPROG-rm}
 58 stripprog=${STRIPPROG-strip}
  
 59 posix_mkdir=
  
 60 #·Desired·mode·of·installed·file.
 61 mode=0755
  
 62 #·Create·dirs·(including·intermediate·dirs)·using·mode·755.
 63 #·This·is·like·GNU·'install'·as·of·coreutils·8.32·(2020).
 64 mkdir_umask=22
  
 65 backupsuffix=
 66 chgrpcmd=
 67 chmodcmd=$chmodprog
 68 chowncmd=
 69 mvcmd=$mvprog
 70 rmcmd="$rmprog·-f"
 71 stripcmd=
  
 72 src=
 73 dst=
 74 dir_arg=
 75 dst_arg=
  
 76 copy_on_change=false
 77 is_target_a_directory=possibly
  
 78 usage="\
 79 Usage:·$0·[OPTION]...·[-T]·SRCFILE·DSTFILE
 80 ···or:·$0·[OPTION]...·SRCFILES...·DIRECTORY
 81 ···or:·$0·[OPTION]...·-t·DIRECTORY·SRCFILES...
 82 ···or:·$0·[OPTION]...·-d·DIRECTORIES...
  
 83 In·the·1st·form,·copy·SRCFILE·to·DSTFILE.
 84 In·the·2nd·and·3rd,·copy·all·SRCFILES·to·DIRECTORY.
 85 In·the·4th,·create·DIRECTORIES.
  
 86 Options:
 87 ·····--help·····display·this·help·and·exit.
 88 ·····--version··display·version·info·and·exit.
  
 89 ··-c············(ignored)
 90 ··-C············install·only·if·different·(preserve·data·modification·time)
 91 ··-d············create·directories·instead·of·installing·files.
 92 ··-g·GROUP······$chgrpprog·installed·files·to·GROUP.
 93 ··-m·MODE·······$chmodprog·installed·files·to·MODE.
 94 ··-o·USER·······$chownprog·installed·files·to·USER.
 95 ··-p············pass·-p·to·$cpprog.
 96 ··-s············$stripprog·installed·files.
 97 ··-S·SUFFIX·····attempt·to·back·up·existing·files,·with·suffix·SUFFIX.
 98 ··-t·DIRECTORY··install·into·DIRECTORY.
 99 ··-T············report·an·error·if·DSTFILE·is·a·directory.
  
 100 Environment·variables·override·the·default·commands:
 101 ··CHGRPPROG·CHMODPROG·CHOWNPROG·CMPPROG·CPPROG·MKDIRPROG·MVPROG
 102 ··RMPROG·STRIPPROG
  
 103 By·default,·rm·is·invoked·with·-f;·when·overridden·with·RMPROG,
 104 it's·up·to·you·to·specify·-f·if·you·want·it.
  
 105 If·-S·is·not·specified,·no·backups·are·attempted.
  
 106 Email·bug·reports·to·bug-automake@gnu.org.
 107 Automake·home·page:·https://www.gnu.org/software/automake/
 108 "
  
 109 while·test·$#·-ne·0;·do
 110 ··case·$1·in
 111 ····-c)·;;
  
 112 ····-C)·copy_on_change=true;;
  
 113 ····-d)·dir_arg=true;;
  
 114 ····-g)·chgrpcmd="$chgrpprog·$2"
 115 ········shift;;
  
 116 ····--help)·echo·"$usage";·exit·$?;;
  
 117 ····-m)·mode=$2
 118 ········case·$mode·in
 119 ··········*'·'*·|·*"$tab"*·|·*"$nl"*·|·*'*'*·|·*'?'*·|·*'['*)
 120 ············echo·"$0:·invalid·mode:·$mode"·>&2
 121 ············exit·1;;
 122 ········esac
 123 ········shift;;
  
 124 ····-o)·chowncmd="$chownprog·$2"
 125 ········shift;;
  
 126 ····-p)·cpprog="$cpprog·-p";;
  
 127 ····-s)·stripcmd=$stripprog;;
  
 128 ····-S)·backupsuffix="$2"
 129 ········shift;;
  
 130 ····-t)
 131 ········is_target_a_directory=always
 132 ········dst_arg=$2
 133 ········#·Protect·names·problematic·for·'test'·and·other·utilities.
 134 ········case·$dst_arg·in
 135 ··········-*·|·[=\(\)!])·dst_arg=./$dst_arg;;
 136 ········esac
 137 ········shift;;
  
 138 ····-T)·is_target_a_directory=never;;
  
 139 ····--version)·echo·"$0·$scriptversion";·exit·$?;;
  
 140 ····--)·shift
 141 ········break;;
  
 142 ····-*)·echo·"$0:·invalid·option:·$1"·>&2
 143 ········exit·1;;
  
 144 ····*)··break;;
 145 ··esac
 146 ··shift
 147 done
  
 148 #·We·allow·the·use·of·options·-d·and·-T·together,·by·making·-d
 149 #·take·the·precedence;·this·is·for·compatibility·with·GNU·install.
  
 150 if·test·-n·"$dir_arg";·then
 151 ··if·test·-n·"$dst_arg";·then
 152 ····echo·"$0:·target·directory·not·allowed·when·installing·a·directory."·>&2
 153 ····exit·1
 154 ··fi
 155 fi
  
 156 if·test·$#·-ne·0·&&·test·-z·"$dir_arg$dst_arg";·then
 157 ··#·When·-d·is·used,·all·remaining·arguments·are·directories·to·create.
 158 ··#·When·-t·is·used,·the·destination·is·already·specified.
 159 ··#·Otherwise,·the·last·argument·is·the·destination.··Remove·it·from·$@.
 160 ··for·arg
 161 ··do
 162 ····if·test·-n·"$dst_arg";·then
 163 ······#·$@·is·not·empty:·it·contains·at·least·$arg.
 164 ······set·fnord·"$@"·"$dst_arg"
 165 ······shift·#·fnord
 166 ····fi
 167 ····shift·#·arg
 168 ····dst_arg=$arg
 169 ····#·Protect·names·problematic·for·'test'·and·other·utilities.
 170 ····case·$dst_arg·in
 171 ······-*·|·[=\(\)!])·dst_arg=./$dst_arg;;
 172 ····esac
 173 ··done
 174 fi
  
 175 if·test·$#·-eq·0;·then
 176 ··if·test·-z·"$dir_arg";·then
 177 ····echo·"$0:·no·input·file·specified."·>&2
 178 ····exit·1
 179 ··fi
 180 ··#·It's·OK·to·call·'install-sh·-d'·without·argument.
 181 ··#·This·can·happen·when·creating·conditional·directories.
 182 ··exit·0
 183 fi
  
 184 if·test·-z·"$dir_arg";·then
 185 ··if·test·$#·-gt·1·||·test·"$is_target_a_directory"·=·always;·then
 186 ····if·test·!·-d·"$dst_arg";·then
 187 ······echo·"$0:·$dst_arg:·Is·not·a·directory."·>&2
 188 ······exit·1
 189 ····fi
 190 ··fi
 191 fi
  
 192 if·test·-z·"$dir_arg";·then
 193 ··do_exit='(exit·$ret);·exit·$ret'
 194 ··trap·"ret=129;·$do_exit"·1
 195 ··trap·"ret=130;·$do_exit"·2
 196 ··trap·"ret=141;·$do_exit"·13
 197 ··trap·"ret=143;·$do_exit"·15
  
 198 ··#·Set·umask·so·as·not·to·create·temps·with·too-generous·modes.
 199 ··#·However,·'strip'·requires·both·read·and·write·access·to·temps.
 200 ··case·$mode·in
 201 ····#·Optimize·common·cases.
 202 ····*644)·cp_umask=133;;
 203 ····*755)·cp_umask=22;;
  
 204 ····*[0-7])
 205 ······if·test·-z·"$stripcmd";·then
 206 ········u_plus_rw=
 207 ······else
 208 ········u_plus_rw='%·200'
 209 ······fi
 210 ······cp_umask=`expr·'('·777·-·$mode·%·1000·')'·$u_plus_rw`;;
 211 ····*)
 212 ······if·test·-z·"$stripcmd";·then
 213 ········u_plus_rw=
 214 ······else
 215 ········u_plus_rw=,u+rw
 216 ······fi
 217 ······cp_umask=$mode$u_plus_rw;;
 218 ··esac
 219 fi
  
 220 for·src
 221 do
 222 ··#·Protect·names·problematic·for·'test'·and·other·utilities.
 223 ··case·$src·in
 224 ····-*·|·[=\(\)!])·src=./$src;;
 225 ··esac
  
 226 ··if·test·-n·"$dir_arg";·then
 227 ····dst=$src
 228 ····dstdir=$dst
 229 ····test·-d·"$dstdir"
 230 ····dstdir_status=$?
 231 ····#·Don't·chown·directories·that·already·exist.
 232 ····if·test·$dstdir_status·=·0;·then
 233 ······chowncmd=""
 234 ····fi
 235 ··else
  
 236 ····#·Waiting·for·this·to·be·detected·by·the·"$cpprog·$src·$dsttmp"·command
 237 ····#·might·cause·directories·to·be·created,·which·would·be·especially·bad
 238 ····#·if·$src·(and·thus·$dsttmp)·contains·'*'.
 239 ····if·test·!·-f·"$src"·&&·test·!·-d·"$src";·then
 240 ······echo·"$0:·$src·does·not·exist."·>&2
 241 ······exit·1
 242 ····fi
  
 243 ····if·test·-z·"$dst_arg";·then
 244 ······echo·"$0:·no·destination·specified."·>&2
 245 ······exit·1
 246 ····fi
 247 ····dst=$dst_arg
  
 248 ····#·If·destination·is·a·directory,·append·the·input·filename.
 249 ····if·test·-d·"$dst";·then
 250 ······if·test·"$is_target_a_directory"·=·never;·then
 251 ········echo·"$0:·$dst_arg:·Is·a·directory"·>&2
 252 ········exit·1
 253 ······fi
 254 ······dstdir=$dst
 255 ······dstbase=`basename·"$src"`
 256 ······case·$dst·in
 257 »       */)·dst=$dst$dstbase;;
 258 »       *)··dst=$dst/$dstbase;;
 259 ······esac
 260 ······dstdir_status=0
 261 ····else
 262 ······dstdir=`dirname·"$dst"`
 263 ······test·-d·"$dstdir"
 264 ······dstdir_status=$?
 265 ····fi
 266 ··fi
  
 267 ··case·$dstdir·in
 268 ····*/)·dstdirslash=$dstdir;;
 269 ····*)··dstdirslash=$dstdir/;;
 270 ··esac
  
 271 ··obsolete_mkdir_used=false
  
 272 ··if·test·$dstdir_status·!=·0;·then
 273 ····case·$posix_mkdir·in
 274 ······'')
 275 ········#·With·-d,·create·the·new·directory·with·the·user-specified·mode.
 276 ········#·Otherwise,·rely·on·$mkdir_umask.
 277 ········if·test·-n·"$dir_arg";·then
 278 ··········mkdir_mode=-m$mode
 279 ········else
 280 ··········mkdir_mode=
 281 ········fi
  
 282 ········posix_mkdir=false
 283 »       #·The·$RANDOM·variable·is·not·portable·(e.g.,·dash).··Use·it
 284 »       #·here·however·when·possible·just·to·lower·collision·chance.
 285 »       tmpdir=${TMPDIR-/tmp}/ins$RANDOM-$$
  
 286 »       trap·'
 287 »       ··ret=$?
 288 »       ··rmdir·"$tmpdir/a/b"·"$tmpdir/a"·"$tmpdir"·2>/dev/null
 289 »       ··exit·$ret
 290 »       '·0
  
 291 »       #·Because·"mkdir·-p"·follows·existing·symlinks·and·we·likely·work
 292 »       #·directly·in·world-writeable·/tmp,·make·sure·that·the·'$tmpdir'
 293 »       #·directory·is·successfully·created·first·before·we·actually·test
 294 »       #·'mkdir·-p'.
 295 »       if·(umask·$mkdir_umask·&&
 296 »       ····$mkdirprog·$mkdir_mode·"$tmpdir"·&&
 297 »       ····exec·$mkdirprog·$mkdir_mode·-p·--·"$tmpdir/a/b")·>/dev/null·2>&1
 298 »       then
 299 »       ··if·test·-z·"$dir_arg"·||·{
 300 »       ·······#·Check·for·POSIX·incompatibilities·with·-m.
 301 »       ·······#·HP-UX·11.23·and·IRIX·6.5·mkdir·-m·-p·sets·group-·or
 302 »       ·······#·other-writable·bit·of·parent·directory·when·it·shouldn't.
 303 »       ·······#·FreeBSD·6.1·mkdir·-m·-p·sets·mode·of·existing·directory.
 304 »       ·······test_tmpdir="$tmpdir/a"
 305 »       ·······ls_ld_tmpdir=`ls·-ld·"$test_tmpdir"`
 306 »       ·······case·$ls_ld_tmpdir·in
 307 »       »       ·d????-?r-*)·different_mode=700;;
 308 »       »       ·d????-?--*)·different_mode=755;;
 309 »       »       ·*)·false;;
 310 »       ·······esac·&&
 311 »       ·······$mkdirprog·-m$different_mode·-p·--·"$test_tmpdir"·&&·{
 312 »       »       ·ls_ld_tmpdir_1=`ls·-ld·"$test_tmpdir"`
 313 »       »       ·test·"$ls_ld_tmpdir"·=·"$ls_ld_tmpdir_1"
 314 »       ·······}
 315 »       ·····}
 316 »       ··then·posix_mkdir=:
 317 »       ··fi
 318 »       ··rmdir·"$tmpdir/a/b"·"$tmpdir/a"·"$tmpdir"
 319 »       else
 320 »       ··#·Remove·any·dirs·left·behind·by·ancient·mkdir·implementations.
 321 »       ··rmdir·./$mkdir_mode·./-p·./--·"$tmpdir"·2>/dev/null
 322 »       fi
 323 »       trap·''·0;;
 324 ····esac
  
 325 ····if
 326 ······$posix_mkdir·&&·(
 327 ········umask·$mkdir_umask·&&
 328 ········$doit_exec·$mkdirprog·$mkdir_mode·-p·--·"$dstdir"
 329 ······)
 330 ····then·:
 331 ····else
  
 332 ······#·mkdir·does·not·conform·to·POSIX,
 333 ······#·or·it·failed·possibly·due·to·a·race·condition.··Create·the
 334 ······#·directory·the·slow·way,·step·by·step,·checking·for·races·as·we·go.
  
 335 ······case·$dstdir·in
 336 ········/*)·prefix='/';;
 337 ········[-=\(\)!]*)·prefix='./';;
 338 ········*)··prefix='';;
 339 ······esac
  
 340 ······oIFS=$IFS
 341 ······IFS=/
 342 ······set·-f
 343 ······set·fnord·$dstdir
 344 ······shift
 345 ······set·+f
 346 ······IFS=$oIFS
  
 347 ······prefixes=
  
 348 ······for·d
 349 ······do
 350 ········test·X"$d"·=·X·&&·continue
  
 351 ········prefix=$prefix$d
 352 ········if·test·-d·"$prefix";·then
 353 ··········prefixes=
 354 ········else
 355 ··········if·$posix_mkdir;·then
 356 ············(umask·$mkdir_umask·&&
 357 ·············$doit_exec·$mkdirprog·$mkdir_mode·-p·--·"$dstdir")·&&·break
 358 ············#·Don't·fail·if·two·instances·are·running·concurrently.
 359 ············test·-d·"$prefix"·||·exit·1
 360 ··········else
 361 ············case·$prefix·in
 362 ··············*\'*)·qprefix=`echo·"$prefix"·|·sed·"s/'/'\\\\\\\\''/g"`;;
 363 ··············*)·qprefix=$prefix;;
 364 ············esac
 365 ············prefixes="$prefixes·'$qprefix'"
 366 ··········fi
 367 ········fi
 368 ········prefix=$prefix/
 369 ······done
  
 370 ······if·test·-n·"$prefixes";·then
 371 ········#·Don't·fail·if·two·instances·are·running·concurrently.
 372 ········(umask·$mkdir_umask·&&
 373 ·········eval·"\$doit_exec·\$mkdirprog·$prefixes")·||
 374 ··········test·-d·"$dstdir"·||·exit·1
 375 ········obsolete_mkdir_used=true
 376 ······fi
 377 ····fi
 378 ··fi
  
 379 ··if·test·-n·"$dir_arg";·then
 380 ····{·test·-z·"$chowncmd"·||·$doit·$chowncmd·"$dst";·}·&&
 381 ····{·test·-z·"$chgrpcmd"·||·$doit·$chgrpcmd·"$dst";·}·&&
 382 ····{·test·"$obsolete_mkdir_used$chowncmd$chgrpcmd"·=·false·||
 383 ······test·-z·"$chmodcmd"·||·$doit·$chmodcmd·$mode·"$dst";·}·||·exit·1
 384 ··else
  
 385 ····#·Make·a·couple·of·temp·file·names·in·the·proper·directory.
 386 ····dsttmp=${dstdirslash}_inst.$$_
 387 ····rmtmp=${dstdirslash}_rm.$$_
  
 388 ····#·Trap·to·clean·up·those·temp·files·at·exit.
 389 ····trap·'ret=$?;·rm·-f·"$dsttmp"·"$rmtmp"·&&·exit·$ret'·0
  
 390 ····#·Copy·the·file·name·to·the·temp·name.
 391 ····(umask·$cp_umask·&&
 392 ·····{·test·-z·"$stripcmd"·||·{
 393 »       ·#·Create·$dsttmp·read-write·so·that·cp·doesn't·create·it·read-only,
 394 »       ·#·which·would·cause·strip·to·fail.
 395 »       ·if·test·-z·"$doit";·then
 396 »       ···:·>"$dsttmp"·#·No·need·to·fork-exec·'touch'.
 397 »       ·else
 398 »       ···$doit·touch·"$dsttmp"
 399 »       ·fi
 400 ·······}
 401 ·····}·&&
 402 ·····$doit_exec·$cpprog·"$src"·"$dsttmp")·&&
  
 403 ····#·and·set·any·options;·do·chmod·last·to·preserve·setuid·bits.
 404 ····#
 405 ····#·If·any·of·these·fail,·we·abort·the·whole·thing.··If·we·want·to
 406 ····#·ignore·errors·from·any·of·these,·just·make·sure·not·to·ignore
 407 ····#·errors·from·the·above·"$doit·$cpprog·$src·$dsttmp"·command.
 408 ····#
 409 ····{·test·-z·"$chowncmd"·||·$doit·$chowncmd·"$dsttmp";·}·&&
 410 ····{·test·-z·"$chgrpcmd"·||·$doit·$chgrpcmd·"$dsttmp";·}·&&
 411 ····{·test·-z·"$stripcmd"·||·$doit·$stripcmd·"$dsttmp";·}·&&
 412 ····{·test·-z·"$chmodcmd"·||·$doit·$chmodcmd·$mode·"$dsttmp";·}·&&
  
 413 ····#·If·-C,·don't·bother·to·copy·if·it·wouldn't·change·the·file.
 414 ····if·$copy_on_change·&&
 415 ·······old=`LC_ALL=C·ls·-dlL·"$dst"·····2>/dev/null`·&&
 416 ·······new=`LC_ALL=C·ls·-dlL·"$dsttmp"··2>/dev/null`·&&
 417 ·······set·-f·&&
 418 ·······set·X·$old·&&·old=:$2:$4:$5:$6·&&
 419 ·······set·X·$new·&&·new=:$2:$4:$5:$6·&&
 420 ·······set·+f·&&
 421 ·······test·"$old"·=·"$new"·&&
 422 ·······$cmpprog·"$dst"·"$dsttmp"·>/dev/null·2>&1
 423 ····then
 424 ······rm·-f·"$dsttmp"
 425 ····else
 426 ······#·If·$backupsuffix·is·set,·and·the·file·being·installed
 427 ······#·already·exists,·attempt·a·backup.··Don't·worry·if·it·fails,
 428 ······#·e.g.,·if·mv·doesn't·support·-f.
 429 ······if·test·-n·"$backupsuffix"·&&·test·-f·"$dst";·then
 430 ········$doit·$mvcmd·-f·"$dst"·"$dst$backupsuffix"·2>/dev/null
 431 ······fi
  
 432 ······#·Rename·the·file·to·the·real·destination.
 433 ······$doit·$mvcmd·-f·"$dsttmp"·"$dst"·2>/dev/null·||
  
 434 ······#·The·rename·failed,·perhaps·because·mv·can't·rename·something·else
 435 ······#·to·itself,·or·perhaps·because·mv·is·so·ancient·that·it·does·not
 436 ······#·support·-f.
 437 ······{
 438 ········#·Now·remove·or·move·aside·any·old·file·at·destination·location.
 439 ········#·We·try·this·two·ways·since·rm·can't·unlink·itself·on·some
 440 ········#·systems·and·the·destination·file·might·be·busy·for·other
 441 ········#·reasons.··In·this·case,·the·final·cleanup·might·fail·but·the·new
 442 ········#·file·should·still·install·successfully.
 443 ········{
 444 ··········test·!·-f·"$dst"·||
 445 ··········$doit·$rmcmd·"$dst"·2>/dev/null·||
 446 ··········{·$doit·$mvcmd·-f·"$dst"·"$rmtmp"·2>/dev/null·&&
 447 ············{·$doit·$rmcmd·"$rmtmp"·2>/dev/null;·:;·}
 448 ··········}·||
 449 ··········{·echo·"$0:·cannot·unlink·or·rename·$dst"·>&2
 450 ············(exit·1);·exit·1
 451 ··········}
 452 ········}·&&
  
 453 ········#·Now·rename·the·file·to·the·real·destination.
 454 ········$doit·$mvcmd·"$dsttmp"·"$dst"
 455 ······}
 456 ····fi·||·exit·1
  
 457 ····trap·''·0
 458 ··fi
 459 done
  
 460 #·Local·variables:
 461 #·eval:·(add-hook·'before-save-hook·'time-stamp)
 462 #·time-stamp-start:·"scriptversion="
 463 #·time-stamp-format:·"%:y-%02m-%02d.%02H"
 464 #·time-stamp-time-zone:·"UTC0"
 465 #·time-stamp-end:·";·#·UTC"
 466 #·End: