📄 shtool
字号:
#!/bin/sh#### GNU shtool -- The GNU Portable Shell Tool## Copyright (c) 1994-2000 Ralf S. Engelschall <rse@engelschall.com>#### See http://www.gnu.org/software/shtool/ for more information.## See ftp://ftp.gnu.org/gnu/shtool/ for latest version.#### Version: 1.5.1 (29-Jul-2000)## Contents: 3/17 available modules###### This program is free software; you can redistribute it and/or modify## it under the terms of the GNU General Public License as published by## the Free Software Foundation; either version 2 of the License, or## (at your option) any later version.#### This program is distributed in the hope that it will be useful,## but WITHOUT ANY WARRANTY; without even the implied warranty of## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU## General Public License for more details.#### You should have received a copy of the GNU General Public License## along with this program; if not, write to the Free Software## Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,## USA, or contact Ralf S. Engelschall <rse@engelschall.com>.#### Notice: Given that you include this file verbatim into your own## source tree, you are justified in saying that it remains separate## from your package, and that this way you are simply just using GNU## shtool. So, in this situation, there is no requirement that your## package itself is licensed under the GNU General Public License in## order to take advantage of GNU shtool.###### Usage: shtool [<options>] [<cmd-name> [<cmd-options>] [<cmd-args>]]#### Available commands:## install Install a program, script or datafile## mkdir Make one or more directories## mkshadow Make a shadow tree through symbolic links#### Not available commands (because module was not built-in):## echo Print string with optional construct expansion## mdate Pretty-print modification time of a file or dir## table Pretty-print a field-separated list as a table## prop Display progress with a running propeller## move Move files with simultaneous substitution## mkln Make link with calculation of relative paths## fixperm Fix file permissions inside a source tree## tarball Roll distribution tarballs## guessos Simple operating system guesser## arx Extended archive command## slo Separate linker options by library class## scpp Sharing C Pre-Processor## version Maintain a version information file## path Deal with program paths##if [ $# -eq 0 ]; then echo "$0:Error: invalid command line" 1>&2 echo "$0:Hint: run \`$0 -h' for usage" 1>&2 exit 1fiif [ ".$1" = ".-h" -o ".$1" = ".--help" ]; then echo "This is GNU shtool, version 1.5.1 (29-Jul-2000)" echo "Copyright (c) 1994-2000 Ralf S. Engelschall <rse@engelschall.com>" echo "Report bugs to <bug-shtool@gnu.org>" echo '' echo "Usage: shtool [<options>] [<cmd-name> [<cmd-options>] [<cmd-args>]]" echo '' echo 'Available global <options>:' echo ' -v, --version display shtool version information' echo ' -h, --help display shtool usage help page (this one)' echo ' -d, --debug display shell trace information' echo ' -r, --recreate recreate this shtool script via shtoolize' echo '' echo 'Available <cmd-name> [<cmd-options>] [<cmd-args>]:' echo ' install [-v] [-t] [-c] [-C] [-s] [-m<mode>] [-o<owner>] [-g<group>]' echo ' [-e<ext>] <file> [<file> ...] <path>' echo ' mkdir [-t] [-f] [-p] [-m<mode>] <dir> [<dir> ...]' echo ' mkshadow [-v] [-t] [-a] <src-dir> <dst-dir>' echo '' echo 'Not available <cmd-name> (because module was not built-in):' echo ' echo [-n] [-e] [<str> ...]' echo ' mdate [-n] [-z] [-s] [-d] [-f<str>] [-o<spec>] <path>' echo ' table [-F<sep>] [-w<width>] [-c<cols>] [-s<strip>] <str><sep><str>...' echo ' prop [-p<str>]' echo ' move [-v] [-t] [-e] [-p] <src-file> <dst-file>' echo ' mkln [-t] [-f] [-s] <src-path> [<src-path> ...] <dst-path>' echo ' fixperm [-v] [-t] <path> [<path> ...]' echo ' tarball [-t] [-v] [-o <tarball>] [-c <prog>] [-d <dir>] [-u' echo ' <user>] [-g <group>] [-e <pattern>] <path> [<path> ...]' echo ' guessos ' echo ' arx [-t] [-C<cmd>] <op> <archive> [<file> ...]' echo ' slo [-p<str>] -- -L<dir> -l<lib> [-L<dir> -l<lib> ...]' echo ' scpp [-v] [-p] [-f<filter>] [-o<ofile>] [-t<tfile>] [-M<mark>]' echo ' [-D<dname>] [-C<cname>] <file> [<file> ...]' echo ' version [-l<lang>] [-n<name>] [-p<prefix>] [-s<version>] [-e]' echo ' [-i<knob>] [-d<type>] <file>' echo ' path [-s] [-r] [-d] [-b] [-m] [-p<path>] <str> [<str> ...]' echo '' exit 0fiif [ ".$1" = ".-v" -o ".$1" = ."--version" ]; then echo "GNU shtool 1.5.1 (29-Jul-2000)" exit 0fiif [ ".$1" = ".-r" -o ".$1" = ."--recreate" ]; then shtoolize -oshtool install mkdir mkshadow exit 0fiif [ ".$1" = ".-d" -o ".$1" = ."--debug" ]; then shift set -xfiname=`echo "$0" | sed -e 's;.*/\([^/]*\)$;\1;' -e 's;-sh$;;' -e 's;\.sh$;;'`case "$name" in install|mkdir|mkshadow ) # implicit tool command selection tool="$name" ;; * ) # explicit tool command selection tool="$1" shift ;;esacarg_spec=""opt_spec=""gen_tmpfile=no#### DISPATCH INTO SCRIPT PROLOG##case $tool in install ) str_tool="install" str_usage="[-v] [-t] [-c] [-C] [-s] [-m<mode>] [-o<owner>] [-g<group>] [-e<ext>] <file> [<file> ...] <path>" arg_spec="2+" opt_spec="v.t.c.C.s.m:o:g:e:" opt_v=no opt_t=no opt_c=no opt_C=no opt_s=no opt_m="" opt_o="" opt_g="" opt_e="" ;; mkdir ) str_tool="mkdir" str_usage="[-t] [-f] [-p] [-m<mode>] <dir> [<dir> ...]" arg_spec="1+" opt_spec="t.f.p.m:" opt_t=no opt_f=no opt_p=no opt_m="" ;; mkshadow ) str_tool="mkshadow" str_usage="[-v] [-t] [-a] <src-dir> <dst-dir>" arg_spec="2=" opt_spec="v.t.a." opt_v=no opt_t=no opt_a=no ;; -* ) echo "$0:Error: unknown option \`$tool'" 2>&1 echo "$0:Hint: run \`$0 -h' for usage" 2>&1 exit 1 ;; * ) echo "$0:Error: unknown command \`$tool'" 2>&1 echo "$0:Hint: run \`$0 -h' for usage" 2>&1 exit 1 ;;esac#### COMMON UTILITY CODE### determine name of toolif [ ".$tool" != . ]; then # used inside shtool script toolcmd="$0 $tool" toolcmdhelp="shtool $tool" msgprefix="shtool:$tool"else # used as standalone script toolcmd="$0" toolcmdhelp="sh $0" msgprefix="$str_tool"fi# parse argument specification stringeval `echo $arg_spec |\ sed -e 's/^\([0-9]*\)\([+=]\)/arg_NUMS=\1; arg_MODE=\2/'`# parse option specification stringeval `echo h.$opt_spec |\ sed -e 's/\([a-zA-Z0-9]\)\([.:+]\)/opt_MODE_\1=\2;/g'`# interate over argument lineopt_PREV=''while [ $# -gt 0 ]; do # special option stops processing if [ ".$1" = ".--" ]; then shift break fi # determine option and argument opt_ARG_OK=no if [ ".$opt_PREV" != . ]; then # merge previous seen option with argument opt_OPT="$opt_PREV" opt_ARG="$1" opt_ARG_OK=yes opt_PREV='' else # split argument into option and argument case "$1" in -[a-zA-Z0-9]*) eval `echo "x$1" |\ sed -e 's/^x-\([a-zA-Z0-9]\)/opt_OPT="\1";/' \ -e 's/";\(.*\)$/"; opt_ARG="\1"/'` ;; -[a-zA-Z0-9]) opt_OPT=`echo "x$1" | cut -c3-` opt_ARG='' ;; *) break ;; esac fi # eat up option shift # determine whether option needs an argument eval "opt_MODE=\$opt_MODE_${opt_OPT}" if [ ".$opt_ARG" = . -a ".$opt_ARG_OK" != .yes ]; then if [ ".$opt_MODE" = ".:" -o ".$opt_MODE" = ".+" ]; then opt_PREV="$opt_OPT" continue fi fi # process option case $opt_MODE in '.' ) # boolean option eval "opt_${opt_OPT}=yes" ;; ':' ) # option with argument (multiple occurances override) eval "opt_${opt_OPT}=\"\$opt_ARG\"" ;; '+' ) # option with argument (multiple occurances append) eval "opt_${opt_OPT}=\"\$opt_${opt_OPT} \$opt_ARG\"" ;; * ) echo "$msgprefix:Error: unknown option: \`-$opt_OPT'" 1>&2 echo "$msgprefix:Hint: run \`$toolcmdhelp -h' or \`man shtool' for details" 1>&2 exit 1 ;; esacdoneif [ ".$opt_PREV" != . ]; then echo "$msgprefix:Error: missing argument to option \`-$opt_PREV'" 1>&2 echo "$msgprefix:Hint: run \`$toolcmdhelp -h' or \`man shtool' for details" 1>&2 exit 1fi# process help optionif [ ".$opt_h" = .yes ]; then echo "Usage: $toolcmdhelp $str_usage" exit 0fi# complain about incorrect number of argumentscase $arg_MODE in '=' ) if [ $# -ne $arg_NUMS ]; then echo "$msgprefix:Error: invalid number of arguments (exactly $arg_NUMS expected)" 1>&2 echo "$msgprefix:Hint: run \`$toolcmd -h' or \`man shtool' for details" 1>&2 exit 1 fi ;; '+' ) if [ $# -lt $arg_NUMS ]; then echo "$msgprefix:Error: invalid number of arguments (at least $arg_NUMS expected)" 1>&2 echo "$msgprefix:Hint: run \`$toolcmd -h' or \`man shtool' for details" 1>&2 exit 1 fi ;;esac# establish a temporary file on requestif [ ".$gen_tmpfile" = .yes ]; then if [ ".$TMPDIR" != . ]; then tmpdir="$TMPDIR" elif [ ".$TEMPDIR" != . ]; then tmpdir="$TEMPDIR" else tmpdir="/tmp" fi tmpfile="$tmpdir/.shtool.$$" rm -f $tmpfile >/dev/null 2>&1 touch $tmpfilefi#### DISPATCH INTO SCRIPT BODY
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -