File: sh.echo

package info (click to toggle)
shtool 1.6.0-1
  • links: PTS
  • area: main
  • in suites: woody
  • size: 400 kB
  • ctags: 5
  • sloc: perl: 379; makefile: 156; sh: 52
file content (275 lines) | stat: -rw-r--r-- 9,664 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
##
##  echo -- Print string with optional construct expansion
##  Copyright (c) 1998-2002 Ralf S. Engelschall <rse@engelschall.com>
##  Originally written for WML as buildinfo
##
##  This file is part of shtool and 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 file 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>.
##

str_tool="echo"
str_usage="[-n|--newline] [-e|--expand] [<str> ...]"
arg_spec="0+"
opt_spec="n.e."
opt_alias="n:newline,e:expand"
opt_n=no
opt_e=no

. ./sh.common

text="$*"

#   check for broken escape sequence expansion
seo=''
bytes=`echo '\1' | wc -c | awk '{ printf("%s", $1); }'`
if [ ".$bytes" != .3 ]; then
    bytes=`echo -E '\1' | wc -c | awk '{ printf("%s", $1); }'`
    if [ ".$bytes" = .3 ]; then
        seo='-E'
    fi
fi

#   check for existing -n option (to suppress newline)
minusn=''
bytes=`echo -n 123 2>/dev/null | wc -c | awk '{ printf("%s", $1); }'`
if [ ".$bytes" = .3 ]; then
    minusn='-n'
fi

#   determine terminal bold sequence
term_bold=''
term_norm=''
if [ ".$opt_e" = .yes -a ".`echo $text | egrep '%[Bb]'`" != . ]; then
    case $TERM in
        #   for the most important terminal types we directly know the sequences
        xterm|xterm*|vt220|vt220*)
            term_bold=`awk 'BEGIN { printf("%c%c%c%c", 27, 91, 49, 109); }' </dev/null 2>/dev/null`
            term_norm=`awk 'BEGIN { printf("%c%c%c", 27, 91, 109); }' </dev/null 2>/dev/null`
            ;;
        vt100|vt100*)
            term_bold=`awk 'BEGIN { printf("%c%c%c%c%c%c", 27, 91, 49, 109, 0, 0); }' </dev/null 2>/dev/null`
            term_norm=`awk 'BEGIN { printf("%c%c%c%c%c", 27, 91, 109, 0, 0); }' </dev/null 2>/dev/null`
            ;;
        #   for all others, we try to use a possibly existing `tput' or `tcout' utility
        * )
            paths=`echo $PATH | sed -e 's/:/ /g'`
            for tool in tput tcout; do
                for dir in $paths; do
                    if [ -r "$dir/$tool" ]; then
                        for seq in bold md smso; do # 'smso' is last
                            bold="`$dir/$tool $seq 2>/dev/null`"
                            if [ ".$bold" != . ]; then
                                term_bold="$bold"
                                break
                            fi
                        done
                        if [ ".$term_bold" != . ]; then
                            for seq in sgr0 me rmso reset; do # 'reset' is last
                                norm="`$dir/$tool $seq 2>/dev/null`"
                                if [ ".$norm" != . ]; then
                                    term_norm="$norm"
                                    break
                                fi
                            done
                        fi
                        break
                    fi
                done
                if [ ".$term_bold" != . -a ".$term_norm" != . ]; then
                    break;
                fi
            done
            ;;
    esac
    if [ ".$term_bold" = . -o ".$term_norm" = . ]; then
        echo "$msgprefix:Warning: unable to determine terminal sequence for bold mode" 1>&2
    fi
fi

#   determine user name
username=''
if [ ".$opt_e" = .yes -a ".`echo $text | egrep '%[uUgG]'`" != . ]; then
    username="$LOGNAME"
    if [ ".$username" = . ]; then
        username="$USER"
        if [ ".$username" = . ]; then
            username="`(whoami) 2>/dev/null |\
                       awk '{ printf("%s", $1); }'`"
            if [ ".$username" = . ]; then
                username="`(who am i) 2>/dev/null |\
                           awk '{ printf("%s", $1); }'`"
                if [ ".$username" = . ]; then
                    username='unknown'
                fi
            fi
        fi
    fi
fi

#   determine user id
userid=''
if [ ".$opt_e" = .yes -a ".`echo $text | egrep '%U'`" != . ]; then
    userid="`(id -u) 2>/dev/null`"
    if [ ".$userid" = . ]; then
        str="`(id) 2>/dev/null`"
        if [ ".`echo $str | grep '^uid[ 	]*=[ 	]*[0-9]*('`" != . ]; then
            userid=`echo $str | sed -e 's/^uid[ 	]*=[ 	]*//' -e 's/(.*//'`
        fi
        if [ ".$userid" = . ]; then
            userid=`egrep "^${username}:" /etc/passwd 2>/dev/null | \
                    sed -e 's/[^:]*:[^:]*://' -e 's/:.*$//'`
            if [ ".$userid" = . ]; then
                userid=`(ypcat passwd) 2>/dev/null |
                        egrep "^${username}:" | \
                        sed -e 's/[^:]*:[^:]*://' -e 's/:.*$//'`
                if [ ".$userid" = . ]; then
                    userid='?'
                fi
            fi
        fi
    fi
fi

#   determine (primary) group id
groupid=''
if [ ".$opt_e" = .yes -a ".`echo $text | egrep '%[gG]'`" != . ]; then
    groupid=`egrep "^${username}:" /etc/passwd 2>/dev/null | \
             sed -e 's/[^:]*:[^:]*:[^:]*://' -e 's/:.*$//'`
    if [ ".$groupid" = . ]; then
        groupid=`(ypcat passwd) 2>/dev/null | egrep "^${username}:" | \
                 sed -e 's/[^:]*:[^:]*:[^:]*://' -e 's/:.*$//'`
        if [ ".$groupid" = . ]; then
            groupid='?'
        fi
    fi
fi

#   determine (primary) group name
groupname=''
if [ ".$opt_e" = .yes -a ".`echo $text | egrep '%g'`" != . ]; then
    groupname=`egrep "^[^:]*:[^:]*:${groupid}:" /etc/group 2>/dev/null | \
               sed -e 's/:.*$//'`
    if [ ".$groupname" = . ]; then
        groupname=`(ypcat group) 2>/dev/null | \
                   egrep "^[^:]*:[^:]*:${groupid}:" | \
                   sed -e 's/:.*$//'`
        if [ ".$groupname" = . ]; then
            groupname='?'
        fi
    fi
fi

#   determine host and domain name
hostname=''
domainname=''
if [ ".$opt_e" = .yes -a ".`echo $text | egrep '%h'`" != . ]; then
    hostname="`(uname -n) 2>/dev/null |\
               awk '{ printf("%s", $1); }'`"
    if [ ".$hostname" = . ]; then
        hostname="`(hostname) 2>/dev/null |\
                   awk '{ printf("%s", $1); }'`"
        if [ ".$hostname" = . ]; then
            hostname='unknown'
        fi
    fi
    case $hostname in
        *.* )
            domainname=".`echo $hostname | cut -d. -f2-`"
            hostname="`echo $hostname | cut -d. -f1`"
            ;;
    esac
fi
if [ ".$opt_e" = .yes -a ".`echo $text | egrep '%d'`" != . ]; then
    if [ ".$domainname" = . ]; then
        if [ -f /etc/resolv.conf ]; then
            domainname="`egrep '^[ 	]*domain' /etc/resolv.conf | head -1 |\
                         sed -e 's/.*domain//' \
                             -e 's/^[ 	]*//' -e 's/^ *//' -e 's/^	*//' \
                             -e 's/^\.//' -e 's/^/./' |\
                         awk '{ printf("%s", $1); }'`"
            if [ ".$domainname" = . ]; then
                domainname="`egrep '^[ 	]*search' /etc/resolv.conf | head -1 |\
                             sed -e 's/.*search//' \
                                 -e 's/^[ 	]*//' -e 's/^ *//' -e 's/^	*//' \
                                 -e 's/ .*//' -e 's/	.*//' \
                                 -e 's/^\.//' -e 's/^/./' |\
                             awk '{ printf("%s", $1); }'`"
            fi
        fi
    fi
fi

#   determine current time
time_day=''
time_month=''
time_year=''
time_monthname=''
if [ ".$opt_e" = .yes -a ".`echo $text | egrep '%[DMYm]'`" != . ]; then
    time_day=`date '+%d'`
    time_month=`date '+%m'`
    time_year=`date '+%Y' 2>/dev/null`
    if [ ".$time_year" = . ]; then
        time_year=`date '+%y'`
        case $time_year in
            [5-9][0-9]) time_year="19$time_year" ;;
            [0-4][0-9]) time_year="20$time_year" ;;
        esac
    fi
    case $time_month in
        1|01) time_monthname='Jan' ;;
        2|02) time_monthname='Feb' ;;
        3|03) time_monthname='Mar' ;;
        4|04) time_monthname='Apr' ;;
        5|05) time_monthname='May' ;;
        6|06) time_monthname='Jun' ;;
        7|07) time_monthname='Jul' ;;
        8|08) time_monthname='Aug' ;;
        9|09) time_monthname='Sep' ;;
          10) time_monthname='Oct' ;;
          11) time_monthname='Nov' ;;
          12) time_monthname='Dec' ;;
    esac
fi

#   expand special ``%x'' constructs
if [ ".$opt_e" = .yes ]; then
    text=`echo $seo "$text" |\
          sed -e "s/%B/${term_bold}/g" \
              -e "s/%b/${term_norm}/g" \
              -e "s/%u/${username}/g" \
              -e "s/%U/${userid}/g" \
              -e "s/%g/${groupname}/g" \
              -e "s/%G/${groupid}/g" \
              -e "s/%h/${hostname}/g" \
              -e "s/%d/${domainname}/g" \
              -e "s/%D/${time_day}/g" \
              -e "s/%M/${time_month}/g" \
              -e "s/%Y/${time_year}/g" \
              -e "s/%m/${time_monthname}/g" 2>/dev/null`
fi

#   create output
if [ .$opt_n = .no ]; then
    echo $seo "$text"
else
    #   the harder part: echo -n is best, because
    #   awk may complain about some \xx sequences.
    if [ ".$minusn" != . ]; then
        echo $seo $minusn "$text"
    else
        echo dummy | awk '{ printf("%s", TEXT); }' TEXT="$text"
    fi
fi