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