install-sh revision 168023fe
16ea72052Smrg#!/bin/sh 26ea72052Smrg# install - install a program, script, or datafile 3168023feSmrg 4168023feSmrgscriptversion=2009-04-28.21; # UTC 5168023feSmrg 66ea72052Smrg# This originates from X11R5 (mit/util/scripts/install.sh), which was 76ea72052Smrg# later released in X11R6 (xc/config/util/install.sh) with the 86ea72052Smrg# following copyright and license. 96ea72052Smrg# 106ea72052Smrg# Copyright (C) 1994 X Consortium 116ea72052Smrg# 126ea72052Smrg# Permission is hereby granted, free of charge, to any person obtaining a copy 136ea72052Smrg# of this software and associated documentation files (the "Software"), to 146ea72052Smrg# deal in the Software without restriction, including without limitation the 156ea72052Smrg# rights to use, copy, modify, merge, publish, distribute, sublicense, and/or 166ea72052Smrg# sell copies of the Software, and to permit persons to whom the Software is 176ea72052Smrg# furnished to do so, subject to the following conditions: 186ea72052Smrg# 196ea72052Smrg# The above copyright notice and this permission notice shall be included in 206ea72052Smrg# all copies or substantial portions of the Software. 216ea72052Smrg# 226ea72052Smrg# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 236ea72052Smrg# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 246ea72052Smrg# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 256ea72052Smrg# X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN 266ea72052Smrg# AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNEC- 276ea72052Smrg# TION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 286ea72052Smrg# 296ea72052Smrg# Except as contained in this notice, the name of the X Consortium shall not 306ea72052Smrg# be used in advertising or otherwise to promote the sale, use or other deal- 316ea72052Smrg# ings in this Software without prior written authorization from the X Consor- 326ea72052Smrg# tium. 336ea72052Smrg# 346ea72052Smrg# 356ea72052Smrg# FSF changes to this file are in the public domain. 366ea72052Smrg# 376ea72052Smrg# Calling this script install-sh is preferred over install.sh, to prevent 386ea72052Smrg# `make' implicit rules from creating a file called install from it 396ea72052Smrg# when there is no Makefile. 406ea72052Smrg# 416ea72052Smrg# This script is compatible with the BSD install script, but was written 42168023feSmrg# from scratch. 436ea72052Smrg 44168023feSmrgnl=' 45168023feSmrg' 46168023feSmrgIFS=" "" $nl" 476ea72052Smrg 486ea72052Smrg# set DOITPROG to echo to test this script 496ea72052Smrg 506ea72052Smrg# Don't use :- since 4.3BSD and earlier shells don't like it. 51168023feSmrgdoit=${DOITPROG-} 52168023feSmrgif test -z "$doit"; then 53168023feSmrg doit_exec=exec 546ea72052Smrgelse 55168023feSmrg doit_exec=$doit 566ea72052Smrgfi 576ea72052Smrg 58168023feSmrg# Put in absolute file names if you don't have them in your path; 59168023feSmrg# or use environment vars. 60168023feSmrg 61168023feSmrgchgrpprog=${CHGRPPROG-chgrp} 62168023feSmrgchmodprog=${CHMODPROG-chmod} 63168023feSmrgchownprog=${CHOWNPROG-chown} 64168023feSmrgcmpprog=${CMPPROG-cmp} 65168023feSmrgcpprog=${CPPROG-cp} 66168023feSmrgmkdirprog=${MKDIRPROG-mkdir} 67168023feSmrgmvprog=${MVPROG-mv} 68168023feSmrgrmprog=${RMPROG-rm} 69168023feSmrgstripprog=${STRIPPROG-strip} 70168023feSmrg 71168023feSmrgposix_glob='?' 72168023feSmrginitialize_posix_glob=' 73168023feSmrg test "$posix_glob" != "?" || { 74168023feSmrg if (set -f) 2>/dev/null; then 75168023feSmrg posix_glob= 76168023feSmrg else 77168023feSmrg posix_glob=: 78168023feSmrg fi 79168023feSmrg } 80168023feSmrg' 81168023feSmrg 82168023feSmrgposix_mkdir= 83168023feSmrg 84168023feSmrg# Desired mode of installed file. 85168023feSmrgmode=0755 86168023feSmrg 87168023feSmrgchgrpcmd= 88168023feSmrgchmodcmd=$chmodprog 89168023feSmrgchowncmd= 90168023feSmrgmvcmd=$mvprog 91168023feSmrgrmcmd="$rmprog -f" 92168023feSmrgstripcmd= 936ea72052Smrg 94168023feSmrgsrc= 95168023feSmrgdst= 96168023feSmrgdir_arg= 97168023feSmrgdst_arg= 986ea72052Smrg 99168023feSmrgcopy_on_change=false 100168023feSmrgno_target_directory= 1016ea72052Smrg 102168023feSmrgusage="\ 103168023feSmrgUsage: $0 [OPTION]... [-T] SRCFILE DSTFILE 104168023feSmrg or: $0 [OPTION]... SRCFILES... DIRECTORY 105168023feSmrg or: $0 [OPTION]... -t DIRECTORY SRCFILES... 106168023feSmrg or: $0 [OPTION]... -d DIRECTORIES... 1076ea72052Smrg 108168023feSmrgIn the 1st form, copy SRCFILE to DSTFILE. 109168023feSmrgIn the 2nd and 3rd, copy all SRCFILES to DIRECTORY. 110168023feSmrgIn the 4th, create DIRECTORIES. 1116ea72052Smrg 112168023feSmrgOptions: 113168023feSmrg --help display this help and exit. 114168023feSmrg --version display version info and exit. 1156ea72052Smrg 116168023feSmrg -c (ignored) 117168023feSmrg -C install only if different (preserve the last data modification time) 118168023feSmrg -d create directories instead of installing files. 119168023feSmrg -g GROUP $chgrpprog installed files to GROUP. 120168023feSmrg -m MODE $chmodprog installed files to MODE. 121168023feSmrg -o USER $chownprog installed files to USER. 122168023feSmrg -s $stripprog installed files. 123168023feSmrg -t DIRECTORY install into DIRECTORY. 124168023feSmrg -T report an error if DSTFILE is a directory. 1256ea72052Smrg 126168023feSmrgEnvironment variables override the default commands: 127168023feSmrg CHGRPPROG CHMODPROG CHOWNPROG CMPPROG CPPROG MKDIRPROG MVPROG 128168023feSmrg RMPROG STRIPPROG 129168023feSmrg" 1306ea72052Smrg 131168023feSmrgwhile test $# -ne 0; do 132168023feSmrg case $1 in 133168023feSmrg -c) ;; 1346ea72052Smrg 135168023feSmrg -C) copy_on_change=true;; 1366ea72052Smrg 137168023feSmrg -d) dir_arg=true;; 1386ea72052Smrg 139168023feSmrg -g) chgrpcmd="$chgrpprog $2" 140168023feSmrg shift;; 1416ea72052Smrg 142168023feSmrg --help) echo "$usage"; exit $?;; 1436ea72052Smrg 144168023feSmrg -m) mode=$2 145168023feSmrg case $mode in 146168023feSmrg *' '* | *' '* | *' 147168023feSmrg'* | *'*'* | *'?'* | *'['*) 148168023feSmrg echo "$0: invalid mode: $mode" >&2 149168023feSmrg exit 1;; 150168023feSmrg esac 151168023feSmrg shift;; 1526ea72052Smrg 153168023feSmrg -o) chowncmd="$chownprog $2" 154168023feSmrg shift;; 1556ea72052Smrg 156168023feSmrg -s) stripcmd=$stripprog;; 1576ea72052Smrg 158168023feSmrg -t) dst_arg=$2 159168023feSmrg shift;; 1606ea72052Smrg 161168023feSmrg -T) no_target_directory=true;; 1626ea72052Smrg 163168023feSmrg --version) echo "$0 $scriptversion"; exit $?;; 1646ea72052Smrg 165168023feSmrg --) shift 166168023feSmrg break;; 1676ea72052Smrg 168168023feSmrg -*) echo "$0: invalid option: $1" >&2 169168023feSmrg exit 1;; 1706ea72052Smrg 171168023feSmrg *) break;; 172168023feSmrg esac 173168023feSmrg shift 174168023feSmrgdone 1756ea72052Smrg 176168023feSmrgif test $# -ne 0 && test -z "$dir_arg$dst_arg"; then 177168023feSmrg # When -d is used, all remaining arguments are directories to create. 178168023feSmrg # When -t is used, the destination is already specified. 179168023feSmrg # Otherwise, the last argument is the destination. Remove it from $@. 180168023feSmrg for arg 181168023feSmrg do 182168023feSmrg if test -n "$dst_arg"; then 183168023feSmrg # $@ is not empty: it contains at least $arg. 184168023feSmrg set fnord "$@" "$dst_arg" 185168023feSmrg shift # fnord 186168023feSmrg fi 187168023feSmrg shift # arg 188168023feSmrg dst_arg=$arg 189168023feSmrg done 190168023feSmrgfi 1916ea72052Smrg 192168023feSmrgif test $# -eq 0; then 193168023feSmrg if test -z "$dir_arg"; then 194168023feSmrg echo "$0: no input file specified." >&2 195168023feSmrg exit 1 196168023feSmrg fi 197168023feSmrg # It's OK to call `install-sh -d' without argument. 198168023feSmrg # This can happen when creating conditional directories. 199168023feSmrg exit 0 200168023feSmrgfi 2016ea72052Smrg 202168023feSmrgif test -z "$dir_arg"; then 203168023feSmrg trap '(exit $?); exit' 1 2 13 15 204168023feSmrg 205168023feSmrg # Set umask so as not to create temps with too-generous modes. 206168023feSmrg # However, 'strip' requires both read and write access to temps. 207168023feSmrg case $mode in 208168023feSmrg # Optimize common cases. 209168023feSmrg *644) cp_umask=133;; 210168023feSmrg *755) cp_umask=22;; 211168023feSmrg 212168023feSmrg *[0-7]) 213168023feSmrg if test -z "$stripcmd"; then 214168023feSmrg u_plus_rw= 215168023feSmrg else 216168023feSmrg u_plus_rw='% 200' 217168023feSmrg fi 218168023feSmrg cp_umask=`expr '(' 777 - $mode % 1000 ')' $u_plus_rw`;; 219168023feSmrg *) 220168023feSmrg if test -z "$stripcmd"; then 221168023feSmrg u_plus_rw= 222168023feSmrg else 223168023feSmrg u_plus_rw=,u+rw 224168023feSmrg fi 225168023feSmrg cp_umask=$mode$u_plus_rw;; 226168023feSmrg esac 227168023feSmrgfi 2286ea72052Smrg 229168023feSmrgfor src 230168023feSmrgdo 231168023feSmrg # Protect names starting with `-'. 232168023feSmrg case $src in 233168023feSmrg -*) src=./$src;; 234168023feSmrg esac 235168023feSmrg 236168023feSmrg if test -n "$dir_arg"; then 237168023feSmrg dst=$src 238168023feSmrg dstdir=$dst 239168023feSmrg test -d "$dstdir" 240168023feSmrg dstdir_status=$? 241168023feSmrg else 242168023feSmrg 243168023feSmrg # Waiting for this to be detected by the "$cpprog $src $dsttmp" command 244168023feSmrg # might cause directories to be created, which would be especially bad 245168023feSmrg # if $src (and thus $dsttmp) contains '*'. 246168023feSmrg if test ! -f "$src" && test ! -d "$src"; then 247168023feSmrg echo "$0: $src does not exist." >&2 248168023feSmrg exit 1 249168023feSmrg fi 250168023feSmrg 251168023feSmrg if test -z "$dst_arg"; then 252168023feSmrg echo "$0: no destination specified." >&2 253168023feSmrg exit 1 254168023feSmrg fi 255168023feSmrg 256168023feSmrg dst=$dst_arg 257168023feSmrg # Protect names starting with `-'. 258168023feSmrg case $dst in 259168023feSmrg -*) dst=./$dst;; 260168023feSmrg esac 2616ea72052Smrg 262168023feSmrg # If destination is a directory, append the input filename; won't work 263168023feSmrg # if double slashes aren't ignored. 264168023feSmrg if test -d "$dst"; then 265168023feSmrg if test -n "$no_target_directory"; then 266168023feSmrg echo "$0: $dst_arg: Is a directory" >&2 267168023feSmrg exit 1 268168023feSmrg fi 269168023feSmrg dstdir=$dst 270168023feSmrg dst=$dstdir/`basename "$src"` 271168023feSmrg dstdir_status=0 272168023feSmrg else 273168023feSmrg # Prefer dirname, but fall back on a substitute if dirname fails. 274168023feSmrg dstdir=` 275168023feSmrg (dirname "$dst") 2>/dev/null || 276168023feSmrg expr X"$dst" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ 277168023feSmrg X"$dst" : 'X\(//\)[^/]' \| \ 278168023feSmrg X"$dst" : 'X\(//\)$' \| \ 279168023feSmrg X"$dst" : 'X\(/\)' \| . 2>/dev/null || 280168023feSmrg echo X"$dst" | 281168023feSmrg sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ 282168023feSmrg s//\1/ 283168023feSmrg q 284168023feSmrg } 285168023feSmrg /^X\(\/\/\)[^/].*/{ 286168023feSmrg s//\1/ 287168023feSmrg q 288168023feSmrg } 289168023feSmrg /^X\(\/\/\)$/{ 290168023feSmrg s//\1/ 291168023feSmrg q 292168023feSmrg } 293168023feSmrg /^X\(\/\).*/{ 294168023feSmrg s//\1/ 295168023feSmrg q 296168023feSmrg } 297168023feSmrg s/.*/./; q' 298168023feSmrg ` 299168023feSmrg 300168023feSmrg test -d "$dstdir" 301168023feSmrg dstdir_status=$? 302168023feSmrg fi 303168023feSmrg fi 304168023feSmrg 305168023feSmrg obsolete_mkdir_used=false 306168023feSmrg 307168023feSmrg if test $dstdir_status != 0; then 308168023feSmrg case $posix_mkdir in 309168023feSmrg '') 310168023feSmrg # Create intermediate dirs using mode 755 as modified by the umask. 311168023feSmrg # This is like FreeBSD 'install' as of 1997-10-28. 312168023feSmrg umask=`umask` 313168023feSmrg case $stripcmd.$umask in 314168023feSmrg # Optimize common cases. 315168023feSmrg *[2367][2367]) mkdir_umask=$umask;; 316168023feSmrg .*0[02][02] | .[02][02] | .[02]) mkdir_umask=22;; 317168023feSmrg 318168023feSmrg *[0-7]) 319168023feSmrg mkdir_umask=`expr $umask + 22 \ 320168023feSmrg - $umask % 100 % 40 + $umask % 20 \ 321168023feSmrg - $umask % 10 % 4 + $umask % 2 322168023feSmrg `;; 323168023feSmrg *) mkdir_umask=$umask,go-w;; 324168023feSmrg esac 325168023feSmrg 326168023feSmrg # With -d, create the new directory with the user-specified mode. 327168023feSmrg # Otherwise, rely on $mkdir_umask. 328168023feSmrg if test -n "$dir_arg"; then 329168023feSmrg mkdir_mode=-m$mode 3306ea72052Smrg else 331168023feSmrg mkdir_mode= 3326ea72052Smrg fi 3336ea72052Smrg 334168023feSmrg posix_mkdir=false 335168023feSmrg case $umask in 336168023feSmrg *[123567][0-7][0-7]) 337168023feSmrg # POSIX mkdir -p sets u+wx bits regardless of umask, which 338168023feSmrg # is incompatible with FreeBSD 'install' when (umask & 300) != 0. 339168023feSmrg ;; 340168023feSmrg *) 341168023feSmrg tmpdir=${TMPDIR-/tmp}/ins$RANDOM-$$ 342168023feSmrg trap 'ret=$?; rmdir "$tmpdir/d" "$tmpdir" 2>/dev/null; exit $ret' 0 343168023feSmrg 344168023feSmrg if (umask $mkdir_umask && 345168023feSmrg exec $mkdirprog $mkdir_mode -p -- "$tmpdir/d") >/dev/null 2>&1 346168023feSmrg then 347168023feSmrg if test -z "$dir_arg" || { 348168023feSmrg # Check for POSIX incompatibilities with -m. 349168023feSmrg # HP-UX 11.23 and IRIX 6.5 mkdir -m -p sets group- or 350168023feSmrg # other-writeable bit of parent directory when it shouldn't. 351168023feSmrg # FreeBSD 6.1 mkdir -m -p sets mode of existing directory. 352168023feSmrg ls_ld_tmpdir=`ls -ld "$tmpdir"` 353168023feSmrg case $ls_ld_tmpdir in 354168023feSmrg d????-?r-*) different_mode=700;; 355168023feSmrg d????-?--*) different_mode=755;; 356168023feSmrg *) false;; 357168023feSmrg esac && 358168023feSmrg $mkdirprog -m$different_mode -p -- "$tmpdir" && { 359168023feSmrg ls_ld_tmpdir_1=`ls -ld "$tmpdir"` 360168023feSmrg test "$ls_ld_tmpdir" = "$ls_ld_tmpdir_1" 361168023feSmrg } 362168023feSmrg } 363168023feSmrg then posix_mkdir=: 364168023feSmrg fi 365168023feSmrg rmdir "$tmpdir/d" "$tmpdir" 366168023feSmrg else 367168023feSmrg # Remove any dirs left behind by ancient mkdir implementations. 368168023feSmrg rmdir ./$mkdir_mode ./-p ./-- 2>/dev/null 369168023feSmrg fi 370168023feSmrg trap '' 0;; 371168023feSmrg esac;; 372168023feSmrg esac 3736ea72052Smrg 374168023feSmrg if 375168023feSmrg $posix_mkdir && ( 376168023feSmrg umask $mkdir_umask && 377168023feSmrg $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir" 378168023feSmrg ) 379168023feSmrg then : 380168023feSmrg else 381168023feSmrg 382168023feSmrg # The umask is ridiculous, or mkdir does not conform to POSIX, 383168023feSmrg # or it failed possibly due to a race condition. Create the 384168023feSmrg # directory the slow way, step by step, checking for races as we go. 385168023feSmrg 386168023feSmrg case $dstdir in 387168023feSmrg /*) prefix='/';; 388168023feSmrg -*) prefix='./';; 389168023feSmrg *) prefix='';; 390168023feSmrg esac 391168023feSmrg 392168023feSmrg eval "$initialize_posix_glob" 393168023feSmrg 394168023feSmrg oIFS=$IFS 395168023feSmrg IFS=/ 396168023feSmrg $posix_glob set -f 397168023feSmrg set fnord $dstdir 398168023feSmrg shift 399168023feSmrg $posix_glob set +f 400168023feSmrg IFS=$oIFS 401168023feSmrg 402168023feSmrg prefixes= 403168023feSmrg 404168023feSmrg for d 405168023feSmrg do 406168023feSmrg test -z "$d" && continue 407168023feSmrg 408168023feSmrg prefix=$prefix$d 409168023feSmrg if test -d "$prefix"; then 410168023feSmrg prefixes= 411168023feSmrg else 412168023feSmrg if $posix_mkdir; then 413168023feSmrg (umask=$mkdir_umask && 414168023feSmrg $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir") && break 415168023feSmrg # Don't fail if two instances are running concurrently. 416168023feSmrg test -d "$prefix" || exit 1 417168023feSmrg else 418168023feSmrg case $prefix in 419168023feSmrg *\'*) qprefix=`echo "$prefix" | sed "s/'/'\\\\\\\\''/g"`;; 420168023feSmrg *) qprefix=$prefix;; 421168023feSmrg esac 422168023feSmrg prefixes="$prefixes '$qprefix'" 423168023feSmrg fi 424168023feSmrg fi 425168023feSmrg prefix=$prefix/ 426168023feSmrg done 427168023feSmrg 428168023feSmrg if test -n "$prefixes"; then 429168023feSmrg # Don't fail if two instances are running concurrently. 430168023feSmrg (umask $mkdir_umask && 431168023feSmrg eval "\$doit_exec \$mkdirprog $prefixes") || 432168023feSmrg test -d "$dstdir" || exit 1 433168023feSmrg obsolete_mkdir_used=true 434168023feSmrg fi 435168023feSmrg fi 436168023feSmrg fi 437168023feSmrg 438168023feSmrg if test -n "$dir_arg"; then 439168023feSmrg { test -z "$chowncmd" || $doit $chowncmd "$dst"; } && 440168023feSmrg { test -z "$chgrpcmd" || $doit $chgrpcmd "$dst"; } && 441168023feSmrg { test "$obsolete_mkdir_used$chowncmd$chgrpcmd" = false || 442168023feSmrg test -z "$chmodcmd" || $doit $chmodcmd $mode "$dst"; } || exit 1 443168023feSmrg else 444168023feSmrg 445168023feSmrg # Make a couple of temp file names in the proper directory. 446168023feSmrg dsttmp=$dstdir/_inst.$$_ 447168023feSmrg rmtmp=$dstdir/_rm.$$_ 448168023feSmrg 449168023feSmrg # Trap to clean up those temp files at exit. 450168023feSmrg trap 'ret=$?; rm -f "$dsttmp" "$rmtmp" && exit $ret' 0 451168023feSmrg 452168023feSmrg # Copy the file name to the temp name. 453168023feSmrg (umask $cp_umask && $doit_exec $cpprog "$src" "$dsttmp") && 454168023feSmrg 455168023feSmrg # and set any options; do chmod last to preserve setuid bits. 456168023feSmrg # 457168023feSmrg # If any of these fail, we abort the whole thing. If we want to 458168023feSmrg # ignore errors from any of these, just make sure not to ignore 459168023feSmrg # errors from the above "$doit $cpprog $src $dsttmp" command. 460168023feSmrg # 461168023feSmrg { test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } && 462168023feSmrg { test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } && 463168023feSmrg { test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } && 464168023feSmrg { test -z "$chmodcmd" || $doit $chmodcmd $mode "$dsttmp"; } && 465168023feSmrg 466168023feSmrg # If -C, don't bother to copy if it wouldn't change the file. 467168023feSmrg if $copy_on_change && 468168023feSmrg old=`LC_ALL=C ls -dlL "$dst" 2>/dev/null` && 469168023feSmrg new=`LC_ALL=C ls -dlL "$dsttmp" 2>/dev/null` && 470168023feSmrg 471168023feSmrg eval "$initialize_posix_glob" && 472168023feSmrg $posix_glob set -f && 473168023feSmrg set X $old && old=:$2:$4:$5:$6 && 474168023feSmrg set X $new && new=:$2:$4:$5:$6 && 475168023feSmrg $posix_glob set +f && 476168023feSmrg 477168023feSmrg test "$old" = "$new" && 478168023feSmrg $cmpprog "$dst" "$dsttmp" >/dev/null 2>&1 479168023feSmrg then 480168023feSmrg rm -f "$dsttmp" 481168023feSmrg else 482168023feSmrg # Rename the file to the real destination. 483168023feSmrg $doit $mvcmd -f "$dsttmp" "$dst" 2>/dev/null || 484168023feSmrg 485168023feSmrg # The rename failed, perhaps because mv can't rename something else 486168023feSmrg # to itself, or perhaps because mv is so ancient that it does not 487168023feSmrg # support -f. 488168023feSmrg { 489168023feSmrg # Now remove or move aside any old file at destination location. 490168023feSmrg # We try this two ways since rm can't unlink itself on some 491168023feSmrg # systems and the destination file might be busy for other 492168023feSmrg # reasons. In this case, the final cleanup might fail but the new 493168023feSmrg # file should still install successfully. 494168023feSmrg { 495168023feSmrg test ! -f "$dst" || 496168023feSmrg $doit $rmcmd -f "$dst" 2>/dev/null || 497168023feSmrg { $doit $mvcmd -f "$dst" "$rmtmp" 2>/dev/null && 498168023feSmrg { $doit $rmcmd -f "$rmtmp" 2>/dev/null; :; } 499168023feSmrg } || 500168023feSmrg { echo "$0: cannot unlink or rename $dst" >&2 501168023feSmrg (exit 1); exit 1 502168023feSmrg } 503168023feSmrg } && 504168023feSmrg 505168023feSmrg # Now rename the file to the real destination. 506168023feSmrg $doit $mvcmd "$dsttmp" "$dst" 507168023feSmrg } 508168023feSmrg fi || exit 1 509168023feSmrg 510168023feSmrg trap '' 0 511168023feSmrg fi 512168023feSmrgdone 5136ea72052Smrg 514168023feSmrg# Local variables: 515168023feSmrg# eval: (add-hook 'write-file-hooks 'time-stamp) 516168023feSmrg# time-stamp-start: "scriptversion=" 517168023feSmrg# time-stamp-format: "%:y-%02m-%02d.%02H" 518168023feSmrg# time-stamp-time-zone: "UTC" 519168023feSmrg# time-stamp-end: "; # UTC" 520168023feSmrg# End: 521