tzselect.ksh revision 1.11 1 1.8 christos #! /bin/bash
2 1.2 perry #
3 1.11 christos # $NetBSD: tzselect.ksh,v 1.11 2014/08/15 11:04:07 christos Exp $
4 1.2 perry #
5 1.8 christos PKGVERSION='(tzcode) '
6 1.8 christos TZVERSION=see_Makefile
7 1.8 christos REPORT_BUGS_TO=tz@iana.org
8 1.5 kleink
9 1.1 jtc # Ask the user about the time zone, and output the resulting TZ value to stdout.
10 1.1 jtc # Interact with the user via stderr and stdin.
11 1.1 jtc
12 1.6 mlelstv # Contributed by Paul Eggert.
13 1.1 jtc
14 1.1 jtc # Porting notes:
15 1.1 jtc #
16 1.10 christos # This script requires a Posix-like shell and prefers the extension of a
17 1.8 christos # 'select' statement. The 'select' statement was introduced in the
18 1.8 christos # Korn shell and is available in Bash and other shell implementations.
19 1.8 christos # If your host lacks both Bash and the Korn shell, you can get their
20 1.8 christos # source from one of these locations:
21 1.1 jtc #
22 1.8 christos # Bash <http://www.gnu.org/software/bash/bash.html>
23 1.8 christos # Korn Shell <http://www.kornshell.com/>
24 1.8 christos # Public Domain Korn Shell <http://www.cs.mun.ca/~michael/pdksh/>
25 1.1 jtc #
26 1.10 christos # For portability to Solaris 9 /bin/sh this script avoids some POSIX
27 1.10 christos # features and common extensions, such as $(...) (which works sometimes
28 1.10 christos # but not others), $((...)), and $10.
29 1.10 christos #
30 1.1 jtc # This script also uses several features of modern awk programs.
31 1.8 christos # If your host lacks awk, or has an old awk that does not conform to Posix,
32 1.1 jtc # you can use either of the following free programs instead:
33 1.1 jtc #
34 1.8 christos # Gawk (GNU awk) <http://www.gnu.org/software/gawk/>
35 1.8 christos # mawk <http://invisible-island.net/mawk/>
36 1.1 jtc
37 1.1 jtc
38 1.1 jtc # Specify default values for environment variables if they are unset.
39 1.1 jtc : ${AWK=awk}
40 1.10 christos : ${TZDIR=`pwd`}
41 1.1 jtc
42 1.1 jtc # Check for awk Posix compliance.
43 1.1 jtc ($AWK -v x=y 'BEGIN { exit 123 }') </dev/null >/dev/null 2>&1
44 1.1 jtc [ $? = 123 ] || {
45 1.11 christos echo >&2 "$0: Sorry, your '$AWK' program is not Posix compatible."
46 1.1 jtc exit 1
47 1.1 jtc }
48 1.1 jtc
49 1.9 christos coord=
50 1.9 christos location_limit=10
51 1.11 christos zonetabtype=zone1970
52 1.9 christos
53 1.9 christos usage="Usage: tzselect [--version] [--help] [-c COORD] [-n LIMIT]
54 1.6 mlelstv Select a time zone interactively.
55 1.6 mlelstv
56 1.9 christos Options:
57 1.9 christos
58 1.9 christos -c COORD
59 1.9 christos Instead of asking for continent and then country and then city,
60 1.9 christos ask for selection from time zones whose largest cities
61 1.9 christos are closest to the location with geographical coordinates COORD.
62 1.9 christos COORD should use ISO 6709 notation, for example, '-c +4852+00220'
63 1.9 christos for Paris (in degrees and minutes, North and East), or
64 1.9 christos '-c -35-058' for Buenos Aires (in degrees, South and West).
65 1.9 christos
66 1.9 christos -n LIMIT
67 1.9 christos Display at most LIMIT locations when -c is used (default $location_limit).
68 1.9 christos
69 1.9 christos --version
70 1.9 christos Output version information.
71 1.9 christos
72 1.9 christos --help
73 1.9 christos Output this help.
74 1.9 christos
75 1.9 christos Report bugs to $REPORT_BUGS_TO."
76 1.9 christos
77 1.10 christos # Ask the user to select from the function's arguments,
78 1.10 christos # and assign the selected argument to the variable 'select_result'.
79 1.10 christos # Exit on EOF or I/O error. Use the shell's 'select' builtin if available,
80 1.10 christos # falling back on a less-nice but portable substitute otherwise.
81 1.10 christos if
82 1.10 christos case $BASH_VERSION in
83 1.10 christos ?*) : ;;
84 1.10 christos '')
85 1.10 christos # '; exit' should be redundant, but Dash doesn't properly fail without it.
86 1.11 christos (eval 'set --; select x; do break; done; exit') </dev/null 2>/dev/null
87 1.10 christos esac
88 1.10 christos then
89 1.10 christos # Do this inside 'eval', as otherwise the shell might exit when parsing it
90 1.10 christos # even though it is never executed.
91 1.10 christos eval '
92 1.10 christos doselect() {
93 1.10 christos select select_result
94 1.10 christos do
95 1.10 christos case $select_result in
96 1.10 christos "") echo >&2 "Please enter a number in range." ;;
97 1.10 christos ?*) break
98 1.10 christos esac
99 1.10 christos done || exit
100 1.10 christos }
101 1.10 christos
102 1.10 christos # Work around a bug in bash 1.14.7 and earlier, where $PS3 is sent to stdout.
103 1.10 christos case $BASH_VERSION in
104 1.10 christos [01].*)
105 1.10 christos case `echo 1 | (select x in x; do break; done) 2>/dev/null` in
106 1.10 christos ?*) PS3=
107 1.10 christos esac
108 1.10 christos esac
109 1.10 christos '
110 1.10 christos else
111 1.10 christos doselect() {
112 1.10 christos # Field width of the prompt numbers.
113 1.10 christos select_width=`expr $# : '.*'`
114 1.10 christos
115 1.10 christos select_i=
116 1.10 christos
117 1.10 christos while :
118 1.10 christos do
119 1.10 christos case $select_i in
120 1.10 christos '')
121 1.10 christos select_i=0
122 1.10 christos for select_word
123 1.10 christos do
124 1.10 christos select_i=`expr $select_i + 1`
125 1.10 christos printf >&2 "%${select_width}d) %s\\n" $select_i "$select_word"
126 1.10 christos done ;;
127 1.10 christos *[!0-9]*)
128 1.10 christos echo >&2 'Please enter a number in range.' ;;
129 1.10 christos *)
130 1.10 christos if test 1 -le $select_i && test $select_i -le $#; then
131 1.10 christos shift `expr $select_i - 1`
132 1.10 christos select_result=$1
133 1.10 christos break
134 1.10 christos fi
135 1.10 christos echo >&2 'Please enter a number in range.'
136 1.10 christos esac
137 1.10 christos
138 1.10 christos # Prompt and read input.
139 1.10 christos printf >&2 %s "${PS3-#? }"
140 1.10 christos read select_i || exit
141 1.10 christos done
142 1.10 christos }
143 1.10 christos fi
144 1.10 christos
145 1.9 christos while getopts c:n:-: opt
146 1.9 christos do
147 1.9 christos case $opt$OPTARG in
148 1.9 christos c*)
149 1.9 christos coord=$OPTARG ;;
150 1.9 christos n*)
151 1.9 christos location_limit=$OPTARG ;;
152 1.11 christos t*) # Undocumented option, used for developer testing.
153 1.11 christos zonetabtype=$OPTARG ;;
154 1.9 christos -help)
155 1.9 christos exec echo "$usage" ;;
156 1.9 christos -version)
157 1.9 christos exec echo "tzselect $PKGVERSION$TZVERSION" ;;
158 1.9 christos -*)
159 1.9 christos echo >&2 "$0: -$opt$OPTARG: unknown option; try '$0 --help'"; exit 1 ;;
160 1.9 christos *)
161 1.9 christos echo >&2 "$0: try '$0 --help'"; exit 1 ;;
162 1.9 christos esac
163 1.9 christos done
164 1.9 christos
165 1.10 christos shift `expr $OPTIND - 1`
166 1.9 christos case $# in
167 1.9 christos 0) ;;
168 1.9 christos *) echo >&2 "$0: $1: unknown argument"; exit 1 ;;
169 1.9 christos esac
170 1.6 mlelstv
171 1.1 jtc # Make sure the tables are readable.
172 1.1 jtc TZ_COUNTRY_TABLE=$TZDIR/iso3166.tab
173 1.11 christos TZ_ZONE_TABLE=$TZDIR/$zonetabtype.tab
174 1.1 jtc for f in $TZ_COUNTRY_TABLE $TZ_ZONE_TABLE
175 1.1 jtc do
176 1.11 christos <"$f" || {
177 1.1 jtc echo >&2 "$0: time zone files are not set up correctly"
178 1.1 jtc exit 1
179 1.1 jtc }
180 1.1 jtc done
181 1.1 jtc
182 1.1 jtc newline='
183 1.1 jtc '
184 1.1 jtc IFS=$newline
185 1.1 jtc
186 1.1 jtc
187 1.9 christos # Awk script to read a time zone table and output the same table,
188 1.9 christos # with each column preceded by its distance from 'here'.
189 1.9 christos output_distances='
190 1.9 christos BEGIN {
191 1.9 christos FS = "\t"
192 1.9 christos while (getline <TZ_COUNTRY_TABLE)
193 1.9 christos if ($0 ~ /^[^#]/)
194 1.9 christos country[$1] = $2
195 1.9 christos country["US"] = "US" # Otherwise the strings get too long.
196 1.9 christos }
197 1.9 christos function convert_coord(coord, deg, min, ilen, sign, sec) {
198 1.9 christos if (coord ~ /^[-+]?[0-9]?[0-9][0-9][0-9][0-9][0-9][0-9]([^0-9]|$)/) {
199 1.9 christos degminsec = coord
200 1.9 christos intdeg = degminsec < 0 ? -int(-degminsec / 10000) : int(degminsec / 10000)
201 1.9 christos minsec = degminsec - intdeg * 10000
202 1.9 christos intmin = minsec < 0 ? -int(-minsec / 100) : int(minsec / 100)
203 1.9 christos sec = minsec - intmin * 100
204 1.9 christos deg = (intdeg * 3600 + intmin * 60 + sec) / 3600
205 1.9 christos } else if (coord ~ /^[-+]?[0-9]?[0-9][0-9][0-9][0-9]([^0-9]|$)/) {
206 1.9 christos degmin = coord
207 1.9 christos intdeg = degmin < 0 ? -int(-degmin / 100) : int(degmin / 100)
208 1.9 christos min = degmin - intdeg * 100
209 1.9 christos deg = (intdeg * 60 + min) / 60
210 1.9 christos } else
211 1.9 christos deg = coord
212 1.9 christos return deg * 0.017453292519943296
213 1.9 christos }
214 1.9 christos function convert_latitude(coord) {
215 1.9 christos match(coord, /..*[-+]/)
216 1.9 christos return convert_coord(substr(coord, 1, RLENGTH - 1))
217 1.9 christos }
218 1.9 christos function convert_longitude(coord) {
219 1.9 christos match(coord, /..*[-+]/)
220 1.9 christos return convert_coord(substr(coord, RLENGTH))
221 1.9 christos }
222 1.9 christos # Great-circle distance between points with given latitude and longitude.
223 1.9 christos # Inputs and output are in radians. This uses the great-circle special
224 1.9 christos # case of the Vicenty formula for distances on ellipsoids.
225 1.9 christos function dist(lat1, long1, lat2, long2, dlong, x, y, num, denom) {
226 1.9 christos dlong = long2 - long1
227 1.9 christos x = cos (lat2) * sin (dlong)
228 1.9 christos y = cos (lat1) * sin (lat2) - sin (lat1) * cos (lat2) * cos (dlong)
229 1.9 christos num = sqrt (x * x + y * y)
230 1.9 christos denom = sin (lat1) * sin (lat2) + cos (lat1) * cos (lat2) * cos (dlong)
231 1.9 christos return atan2(num, denom)
232 1.9 christos }
233 1.9 christos BEGIN {
234 1.9 christos coord_lat = convert_latitude(coord)
235 1.9 christos coord_long = convert_longitude(coord)
236 1.9 christos }
237 1.9 christos /^[^#]/ {
238 1.9 christos here_lat = convert_latitude($2)
239 1.9 christos here_long = convert_longitude($2)
240 1.11 christos line = $1 "\t" $2 "\t" $3
241 1.11 christos sep = "\t"
242 1.11 christos ncc = split($1, cc, /,/)
243 1.11 christos for (i = 1; i <= ncc; i++) {
244 1.11 christos line = line sep country[cc[i]]
245 1.11 christos sep = ", "
246 1.11 christos }
247 1.9 christos if (NF == 4)
248 1.9 christos line = line " - " $4
249 1.9 christos printf "%g\t%s\n", dist(coord_lat, coord_long, here_lat, here_long), line
250 1.9 christos }
251 1.9 christos '
252 1.1 jtc
253 1.1 jtc # Begin the main loop. We come back here if the user wants to retry.
254 1.1 jtc while
255 1.1 jtc
256 1.1 jtc echo >&2 'Please identify a location' \
257 1.1 jtc 'so that time zone rules can be set correctly.'
258 1.1 jtc
259 1.1 jtc continent=
260 1.1 jtc country=
261 1.1 jtc region=
262 1.1 jtc
263 1.9 christos case $coord in
264 1.9 christos ?*)
265 1.9 christos continent=coord;;
266 1.9 christos '')
267 1.1 jtc
268 1.1 jtc # Ask the user for continent or ocean.
269 1.1 jtc
270 1.9 christos echo >&2 'Please select a continent, ocean, "coord", or "TZ".'
271 1.1 jtc
272 1.10 christos quoted_continents=`
273 1.10 christos $AWK '
274 1.10 christos BEGIN { FS = "\t" }
275 1.9 christos /^[^#]/ {
276 1.9 christos entry = substr($3, 1, index($3, "/") - 1)
277 1.9 christos if (entry == "America")
278 1.9 christos entry = entry "s"
279 1.9 christos if (entry ~ /^(Arctic|Atlantic|Indian|Pacific)$/)
280 1.9 christos entry = entry " Ocean"
281 1.9 christos printf "'\''%s'\''\n", entry
282 1.9 christos }
283 1.11 christos ' <"$TZ_ZONE_TABLE" |
284 1.9 christos sort -u |
285 1.9 christos tr '\n' ' '
286 1.9 christos echo ''
287 1.10 christos `
288 1.9 christos
289 1.9 christos eval '
290 1.10 christos doselect '"$quoted_continents"' \
291 1.9 christos "coord - I want to use geographical coordinates." \
292 1.9 christos "TZ - I want to specify the time zone using the Posix TZ format."
293 1.10 christos continent=$select_result
294 1.10 christos case $continent in
295 1.10 christos Americas) continent=America;;
296 1.10 christos *" "*) continent=`expr "$continent" : '\''\([^ ]*\)'\''`
297 1.10 christos esac
298 1.9 christos '
299 1.9 christos esac
300 1.9 christos
301 1.1 jtc case $continent in
302 1.9 christos TZ)
303 1.1 jtc # Ask the user for a Posix TZ string. Check that it conforms.
304 1.1 jtc while
305 1.1 jtc echo >&2 'Please enter the desired value' \
306 1.1 jtc 'of the TZ environment variable.'
307 1.1 jtc echo >&2 'For example, GST-10 is a zone named GST' \
308 1.1 jtc 'that is 10 hours ahead (east) of UTC.'
309 1.1 jtc read TZ
310 1.1 jtc $AWK -v TZ="$TZ" 'BEGIN {
311 1.1 jtc tzname = "[^-+,0-9][^-+,0-9][^-+,0-9]+"
312 1.1 jtc time = "[0-2]?[0-9](:[0-5][0-9](:[0-5][0-9])?)?"
313 1.1 jtc offset = "[-+]?" time
314 1.1 jtc date = "(J?[0-9]+|M[0-9]+\.[0-9]+\.[0-9]+)"
315 1.1 jtc datetime = "," date "(/" time ")?"
316 1.1 jtc tzpattern = "^(:.*|" tzname offset "(" tzname \
317 1.1 jtc "(" offset ")?(" datetime datetime ")?)?)$"
318 1.1 jtc if (TZ ~ tzpattern) exit 1
319 1.1 jtc exit 0
320 1.1 jtc }'
321 1.1 jtc do
322 1.11 christos echo >&2 "'$TZ' is not a conforming" \
323 1.1 jtc 'Posix time zone string.'
324 1.1 jtc done
325 1.1 jtc TZ_for_date=$TZ;;
326 1.1 jtc *)
327 1.9 christos case $continent in
328 1.9 christos coord)
329 1.9 christos case $coord in
330 1.9 christos '')
331 1.9 christos echo >&2 'Please enter coordinates' \
332 1.9 christos 'in ISO 6709 notation.'
333 1.9 christos echo >&2 'For example, +4042-07403 stands for'
334 1.9 christos echo >&2 '40 degrees 42 minutes north,' \
335 1.9 christos '74 degrees 3 minutes west.'
336 1.9 christos read coord;;
337 1.9 christos esac
338 1.10 christos distance_table=`$AWK \
339 1.9 christos -v coord="$coord" \
340 1.9 christos -v TZ_COUNTRY_TABLE="$TZ_COUNTRY_TABLE" \
341 1.11 christos "$output_distances" <"$TZ_ZONE_TABLE" |
342 1.9 christos sort -n |
343 1.9 christos sed "${location_limit}q"
344 1.10 christos `
345 1.10 christos regions=`echo "$distance_table" | $AWK '
346 1.9 christos BEGIN { FS = "\t" }
347 1.9 christos { print $NF }
348 1.10 christos '`
349 1.9 christos echo >&2 'Please select one of the following' \
350 1.9 christos 'time zone regions,'
351 1.9 christos echo >&2 'listed roughly in increasing order' \
352 1.9 christos "of distance from $coord".
353 1.10 christos doselect $regions
354 1.10 christos region=$select_result
355 1.10 christos TZ=`echo "$distance_table" | $AWK -v region="$region" '
356 1.9 christos BEGIN { FS="\t" }
357 1.9 christos $NF == region { print $4 }
358 1.10 christos '`
359 1.9 christos ;;
360 1.9 christos *)
361 1.1 jtc # Get list of names of countries in the continent or ocean.
362 1.10 christos countries=`$AWK \
363 1.1 jtc -v continent="$continent" \
364 1.1 jtc -v TZ_COUNTRY_TABLE="$TZ_COUNTRY_TABLE" \
365 1.1 jtc '
366 1.10 christos BEGIN { FS = "\t" }
367 1.1 jtc /^#/ { next }
368 1.1 jtc $3 ~ ("^" continent "/") {
369 1.11 christos ncc = split($1, cc, /,/)
370 1.11 christos for (i = 1; i <= ncc; i++)
371 1.11 christos if (!cc_seen[cc[i]]++) cc_list[++ccs] = cc[i]
372 1.1 jtc }
373 1.1 jtc END {
374 1.1 jtc while (getline <TZ_COUNTRY_TABLE) {
375 1.1 jtc if ($0 !~ /^#/) cc_name[$1] = $2
376 1.1 jtc }
377 1.1 jtc for (i = 1; i <= ccs; i++) {
378 1.1 jtc country = cc_list[i]
379 1.1 jtc if (cc_name[country]) {
380 1.1 jtc country = cc_name[country]
381 1.1 jtc }
382 1.1 jtc print country
383 1.1 jtc }
384 1.1 jtc }
385 1.11 christos ' <"$TZ_ZONE_TABLE" | sort -f`
386 1.1 jtc
387 1.1 jtc
388 1.1 jtc # If there's more than one country, ask the user which one.
389 1.1 jtc case $countries in
390 1.1 jtc *"$newline"*)
391 1.9 christos echo >&2 'Please select a country' \
392 1.9 christos 'whose clocks agree with yours.'
393 1.10 christos doselect $countries
394 1.10 christos country=$select_result;;
395 1.1 jtc *)
396 1.1 jtc country=$countries
397 1.1 jtc esac
398 1.1 jtc
399 1.1 jtc
400 1.1 jtc # Get list of names of time zone rule regions in the country.
401 1.10 christos regions=`$AWK \
402 1.1 jtc -v country="$country" \
403 1.1 jtc -v TZ_COUNTRY_TABLE="$TZ_COUNTRY_TABLE" \
404 1.1 jtc '
405 1.1 jtc BEGIN {
406 1.10 christos FS = "\t"
407 1.1 jtc cc = country
408 1.1 jtc while (getline <TZ_COUNTRY_TABLE) {
409 1.1 jtc if ($0 !~ /^#/ && country == $2) {
410 1.1 jtc cc = $1
411 1.1 jtc break
412 1.1 jtc }
413 1.1 jtc }
414 1.1 jtc }
415 1.11 christos $1 ~ cc { print $4 }
416 1.11 christos ' <"$TZ_ZONE_TABLE"`
417 1.1 jtc
418 1.1 jtc
419 1.1 jtc # If there's more than one region, ask the user which one.
420 1.1 jtc case $regions in
421 1.1 jtc *"$newline"*)
422 1.1 jtc echo >&2 'Please select one of the following' \
423 1.1 jtc 'time zone regions.'
424 1.10 christos doselect $regions
425 1.10 christos region=$select_result;;
426 1.1 jtc *)
427 1.1 jtc region=$regions
428 1.1 jtc esac
429 1.1 jtc
430 1.1 jtc # Determine TZ from country and region.
431 1.10 christos TZ=`$AWK \
432 1.1 jtc -v country="$country" \
433 1.1 jtc -v region="$region" \
434 1.1 jtc -v TZ_COUNTRY_TABLE="$TZ_COUNTRY_TABLE" \
435 1.1 jtc '
436 1.1 jtc BEGIN {
437 1.10 christos FS = "\t"
438 1.1 jtc cc = country
439 1.1 jtc while (getline <TZ_COUNTRY_TABLE) {
440 1.1 jtc if ($0 !~ /^#/ && country == $2) {
441 1.1 jtc cc = $1
442 1.1 jtc break
443 1.1 jtc }
444 1.1 jtc }
445 1.1 jtc }
446 1.11 christos $1 ~ cc && $4 == region { print $3 }
447 1.11 christos ' <"$TZ_ZONE_TABLE"`
448 1.9 christos esac
449 1.1 jtc
450 1.1 jtc # Make sure the corresponding zoneinfo file exists.
451 1.1 jtc TZ_for_date=$TZDIR/$TZ
452 1.11 christos <"$TZ_for_date" || {
453 1.1 jtc echo >&2 "$0: time zone files are not set up correctly"
454 1.1 jtc exit 1
455 1.1 jtc }
456 1.1 jtc esac
457 1.1 jtc
458 1.1 jtc
459 1.1 jtc # Use the proposed TZ to output the current date relative to UTC.
460 1.1 jtc # Loop until they agree in seconds.
461 1.1 jtc # Give up after 8 unsuccessful tries.
462 1.1 jtc
463 1.1 jtc extra_info=
464 1.1 jtc for i in 1 2 3 4 5 6 7 8
465 1.1 jtc do
466 1.10 christos TZdate=`LANG=C TZ="$TZ_for_date" date`
467 1.10 christos UTdate=`LANG=C TZ=UTC0 date`
468 1.10 christos TZsec=`expr "$TZdate" : '.*:\([0-5][0-9]\)'`
469 1.10 christos UTsec=`expr "$UTdate" : '.*:\([0-5][0-9]\)'`
470 1.1 jtc case $TZsec in
471 1.1 jtc $UTsec)
472 1.1 jtc extra_info="
473 1.1 jtc Local time is now: $TZdate.
474 1.1 jtc Universal Time is now: $UTdate."
475 1.1 jtc break
476 1.1 jtc esac
477 1.1 jtc done
478 1.1 jtc
479 1.1 jtc
480 1.1 jtc # Output TZ info and ask the user to confirm.
481 1.1 jtc
482 1.1 jtc echo >&2 ""
483 1.1 jtc echo >&2 "The following information has been given:"
484 1.1 jtc echo >&2 ""
485 1.9 christos case $country%$region%$coord in
486 1.9 christos ?*%?*%) echo >&2 " $country$newline $region";;
487 1.9 christos ?*%%) echo >&2 " $country";;
488 1.9 christos %?*%?*) echo >&2 " coord $coord$newline $region";;
489 1.9 christos %%?*) echo >&2 " coord $coord";;
490 1.1 jtc +) echo >&2 " TZ='$TZ'"
491 1.1 jtc esac
492 1.1 jtc echo >&2 ""
493 1.1 jtc echo >&2 "Therefore TZ='$TZ' will be used.$extra_info"
494 1.1 jtc echo >&2 "Is the above information OK?"
495 1.1 jtc
496 1.10 christos doselect Yes No
497 1.10 christos ok=$select_result
498 1.1 jtc case $ok in
499 1.1 jtc Yes) break
500 1.1 jtc esac
501 1.9 christos do coord=
502 1.1 jtc done
503 1.1 jtc
504 1.5 kleink case $SHELL in
505 1.5 kleink *csh) file=.login line="setenv TZ '$TZ'";;
506 1.5 kleink *) file=.profile line="TZ='$TZ'; export TZ"
507 1.5 kleink esac
508 1.5 kleink
509 1.5 kleink echo >&2 "
510 1.5 kleink You can make this change permanent for yourself by appending the line
511 1.5 kleink $line
512 1.5 kleink to the file '$file' in your home directory; then log out and log in again.
513 1.5 kleink
514 1.5 kleink Here is that TZ value again, this time on standard output so that you
515 1.5 kleink can use the $0 command in shell scripts:"
516 1.5 kleink
517 1.1 jtc echo "$TZ"
518