/
snap
/
core18
/
2979
/
usr
/
bin
/
/snap/core18/2979/usr/bin
mkdir
upload
Name
Size
Mode
Actions
aa-enabled
22696
0755
edit
dl
rm
aa-exec
22696
0755
edit
dl
rm
addpart
22608
0755
edit
dl
rm
apt
77
0755
edit
dl
rm
apt-cache
77
0755
edit
dl
rm
apt-get
77
0755
edit
dl
rm
arch
35032
0755
edit
dl
rm
awk
125416
0755
edit
dl
rm
b2sum
55512
0755
edit
dl
rm
base32
39096
0755
edit
dl
rm
base64
39096
0755
edit
dl
rm
basename
35000
0755
edit
dl
rm
bashbug
7115
0755
edit
dl
rm
bootctl
34952
0755
edit
dl
rm
busctl
67672
0755
edit
dl
rm
captoinfo
84080
0755
edit
dl
rm
catchsegv
3334
0755
edit
dl
rm
cautious-launcher
853
0755
edit
dl
rm
chage
71816
2755
edit
dl
rm
chardet3
389
0755
edit
dl
rm
chardetect3
389
0755
edit
dl
rm
chattr
14336
0755
edit
dl
rm
chcon
63672
0755
edit
dl
rm
chfn
76496
4755
edit
dl
rm
chrt
30800
0755
edit
dl
rm
chsh
44528
4755
edit
dl
rm
cksum
35000
0755
edit
dl
rm
clear
10240
0755
edit
dl
rm
clear_console
10312
0755
edit
dl
rm
cloud-id
396
0755
edit
dl
rm
cloud-init
400
0755
edit
dl
rm
cloud-init-per
2108
0755
edit
dl
rm
cmp
47200
0755
edit
dl
rm
comm
39128
0755
edit
dl
rm
compose
18161
0755
edit
dl
rm
console-conf
2931
0755
edit
dl
rm
core-sshd-host-keygen
1565
0755
edit
dl
rm
csplit
51416
0755
edit
dl
rm
ctstat
22888
0755
edit
dl
rm
cut
43224
0755
edit
dl
rm
c_rehash
6806
0755
edit
dl
rm
dbus-cleanup-sockets
10224
0755
edit
dl
rm
dbus-daemon
236584
0755
edit
dl
rm
dbus-monitor
22520
0755
edit
dl
rm
dbus-run-session
10224
0755
edit
dl
rm
dbus-send
26608
0755
edit
dl
rm
dbus-update-activation-environment
14320
0755
edit
dl
rm
dbus-uuidgen
10224
0755
edit
dl
rm
deb-systemd-helper
20142
0755
edit
dl
rm
deb-systemd-invoke
4434
0755
edit
dl
rm
delpart
22608
0755
edit
dl
rm
dh_bash-completion
2550
0755
edit
dl
rm
diff
145752
0755
edit
dl
rm
diff3
63704
0755
edit
dl
rm
dircolors
47296
0755
edit
dl
rm
dirname
30904
0755
edit
dl
rm
dpkg-deb
153952
0755
edit
dl
rm
du
100568
0755
edit
dl
rm
ec2metadata
7297
0755
edit
dl
rm
edit
18161
0755
edit
dl
rm
editor
1112152
0755
edit
dl
rm
env
35000
0755
edit
dl
rm
ex
1112152
0755
edit
dl
rm
expand
39128
0755
edit
dl
rm
expiry
22808
2755
edit
dl
rm
expr
47288
0755
edit
dl
rm
factor
75992
0755
edit
dl
rm
faillog
18728
0755
edit
dl
rm
fallocate
26704
0755
edit
dl
rm
finalrd
2152
0755
edit
dl
rm
find
238080
0755
edit
dl
rm
flock
30880
0755
edit
dl
rm
fmt
43192
0755
edit
dl
rm
fold
35000
0755
edit
dl
rm
free
18512
0755
edit
dl
rm
gdbserver
661016
0755
edit
dl
rm
getconf
30856
0755
edit
dl
rm
getent
31224
0755
edit
dl
rm
getopt
14408
0755
edit
dl
rm
gpasswd
75824
4755
edit
dl
rm
gpgv
441360
0755
edit
dl
rm
groups
35000
0755
edit
dl
rm
growpart
21883
0755
edit
dl
rm
head
43224
0755
edit
dl
rm
helpztags
2514
0755
edit
dl
rm
hostid
30904
0755
edit
dl
rm
hostnamectl
18504
0755
edit
dl
rm
i386
18784
0755
edit
dl
rm
iconv
63744
0755
edit
dl
rm
id
43224
0755
edit
dl
rm
infocmp
59464
0755
edit
dl
rm
infotocap
84080
0755
edit
dl
rm
install
145664
0755
edit
dl
rm
ionice
26704
0755
edit
dl
rm
ipcmk
26768
0755
edit
dl
rm
ipcrm
26704
0755
edit
dl
rm
ipcs
51280
0755
edit
dl
rm
iptables-xml
-
0
edit
dl
rm
ischroot
10280
0755
edit
dl
rm
join
47320
0755
edit
dl
rm
jsondiff
1018
0755
edit
dl
rm
jsonpatch
3661
0755
edit
dl
rm
jsonpointer
1342
0755
edit
dl
rm
jsonschema
398
0755
edit
dl
rm
kernel-install
4508
0755
edit
dl
rm
last
43088
0755
edit
dl
rm
lastb
43088
0755
edit
dl
rm
lastlog
18504
0755
edit
dl
rm
lcf
7786
0755
edit
dl
rm
ldd
5427
0755
edit
dl
rm
less
199048
0755
edit
dl
rm
lessecho
14656
0755
edit
dl
rm
lessfile
9047
0755
edit
dl
rm
lesskey
24272
0755
edit
dl
rm
lesspipe
9047
0755
edit
dl
rm
link
30904
0755
edit
dl
rm
linux32
18784
0755
edit
dl
rm
linux64
18784
0755
edit
dl
rm
lnstat
22888
0755
edit
dl
rm
locale
50592
0755
edit
dl
rm
locale-check
10240
0755
edit
dl
rm
localectl
22600
0755
edit
dl
rm
localedef
338744
0755
edit
dl
rm
logger
47792
0755
edit
dl
rm
logname
30904
0755
edit
dl
rm
lsattr
10240
0755
edit
dl
rm
lscpu
71760
0755
edit
dl
rm
lsipc
71760
0755
edit
dl
rm
lslocks
35232
0755
edit
dl
rm
lslogins
63568
0755
edit
dl
rm
lsmem
43088
0755
edit
dl
rm
lsns
38992
0755
edit
dl
rm
mawk
125416
0755
edit
dl
rm
mcookie
30864
0755
edit
dl
rm
md5sum
43224
0755
edit
dl
rm
md5sum.textutils
43224
0755
edit
dl
rm
mesg
10312
0755
edit
dl
rm
miniterm
35098
0755
edit
dl
rm
mkfifo
63672
0755
edit
dl
rm
mksquashfs
189432
0755
edit
dl
rm
mkswapfile
865
0755
edit
dl
rm
namei
26704
0755
edit
dl
rm
nawk
125416
0755
edit
dl
rm
newgrp
40344
4755
edit
dl
rm
nice
35000
0755
edit
dl
rm
nl
43288
0755
edit
dl
rm
no-apt
77
0755
edit
dl
rm
nohup
35000
0755
edit
dl
rm
nproc
35000
0755
edit
dl
rm
nsenter
31008
0755
edit
dl
rm
nstat
26696
0755
edit
dl
rm
numfmt
63736
0755
edit
dl
rm
od
67800
0755
edit
dl
rm
openssl
723944
0755
edit
dl
rm
pager
170760
0755
edit
dl
rm
partx
88144
0755
edit
dl
rm
passwd
59640
4755
edit
dl
rm
paste
35032
0755
edit
dl
rm
pathchk
35000
0755
edit
dl
rm
pdb3
61310
0755
edit
dl
rm
pdb3.6
61310
0755
edit
dl
rm
perl
2097720
0755
edit
dl
rm
perl5.26.1
2097720
0755
edit
dl
rm
pgrep
26712
0755
edit
dl
rm
pinky
39128
0755
edit
dl
rm
pkill
26712
0755
edit
dl
rm
pldd
14560
0755
edit
dl
rm
pmap
30808
0755
edit
dl
rm
pr
71960
0755
edit
dl
rm
print
18161
0755
edit
dl
rm
printenv
30904
0755
edit
dl
rm
printf
51384
0755
edit
dl
rm
prlimit
35424
0755
edit
dl
rm
probert
2143
0755
edit
dl
rm
ptx
71928
0755
edit
dl
rm
pwdx
10312
0755
edit
dl
rm
py3clean
7812
0755
edit
dl
rm
py3compile
12119
0755
edit
dl
rm
py3versions
11717
0755
edit
dl
rm
pydoc3
79
0755
edit
dl
rm
pydoc3.6
79
0755
edit
dl
rm
pygettext3
21547
0755
edit
dl
rm
pygettext3.6
21547
0755
edit
dl
rm
pyjwt3
372
0755
edit
dl
rm
python3
4530584
0755
edit
dl
rm
python3-jsondiff
1018
0755
edit
dl
rm
python3-jsonpatch
3661
0755
edit
dl
rm
python3-jsonpointer
1342
0755
edit
dl
rm
python3-jsonschema
398
0755
edit
dl
rm
python3.6
4530584
0755
edit
dl
rm
python3.6m
4530584
0755
edit
dl
rm
python3m
4530584
0755
edit
dl
rm
rcp
100496
0755
edit
dl
rm
rdma
26696
0755
edit
dl
rm
realpath
47320
0755
edit
dl
rm
rename.ul
14408
0755
edit
dl
rm
renice
14408
0755
edit
dl
rm
reset
22528
0755
edit
dl
rm
resizepart
38992
0755
edit
dl
rm
rev
10312
0755
edit
dl
rm
rgrep
30
0755
edit
dl
rm
rlogin
727848
0755
edit
dl
rm
routef
208
0755
edit
dl
rm
routel
1656
0755
edit
dl
rm
rsh
727848
0755
edit
dl
rm
rtstat
22888
0755
edit
dl
rm
run-mailcap
18161
0755
edit
dl
rm
runcon
35000
0755
edit
dl
rm
rview
1112152
0755
edit
dl
rm
savelog
10469
0755
edit
dl
rm
scp
100496
0755
edit
dl
rm
script
30792
0755
edit
dl
rm
scriptreplay
26704
0755
edit
dl
rm
sdiff
51296
0755
edit
dl
rm
see
18161
0755
edit
dl
rm
select-editor
2442
0755
edit
dl
rm
sensible-browser
1209
0755
edit
dl
rm
sensible-editor
1109
0755
edit
dl
rm
sensible-pager
433
0755
edit
dl
rm
seq
47288
0755
edit
dl
rm
setarch
18784
0755
edit
dl
rm
setsid
10312
0755
edit
dl
rm
setterm
43088
0755
edit
dl
rm
sftp
153960
0755
edit
dl
rm
sg
40344
4755
edit
dl
rm
sha1sum
47320
0755
edit
dl
rm
sha224sum
55512
0755
edit
dl
rm
sha256sum
55512
0755
edit
dl
rm
sha384sum
59608
0755
edit
dl
rm
sha512sum
59608
0755
edit
dl
rm
shred
59608
0755
edit
dl
rm
shuf
55480
0755
edit
dl
rm
skill
26704
0755
edit
dl
rm
slabtop
18512
0755
edit
dl
rm
slogin
727848
0755
edit
dl
rm
snap
23523401
0755
edit
dl
rm
snapctl
-
0
edit
dl
rm
snice
26704
0755
edit
dl
rm
sort
113120
0755
edit
dl
rm
split
55936
0755
edit
dl
rm
ssh
727848
0755
edit
dl
rm
ssh-add
346248
0755
edit
dl
rm
ssh-agent
362640
2755
edit
dl
rm
ssh-argv0
1456
0755
edit
dl
rm
ssh-copy-id
10658
0755
edit
dl
rm
ssh-keygen
420000
0755
edit
dl
rm
ssh-keyscan
424096
0755
edit
dl
rm
stat
80088
0755
edit
dl
rm
stdbuf
47288
0755
edit
dl
rm
sudo
149080
4755
edit
dl
rm
sudoedit
149080
4755
edit
dl
rm
sudoreplay
56128
0755
edit
dl
rm
sum
39104
0755
edit
dl
rm
systemd-analyze
1562888
0755
edit
dl
rm
systemd-cat
10312
0755
edit
dl
rm
systemd-cgls
14408
0755
edit
dl
rm
systemd-cgtop
30816
0755
edit
dl
rm
systemd-delta
22600
0755
edit
dl
rm
systemd-detect-virt
10304
0755
edit
dl
rm
systemd-mount
43104
0755
edit
dl
rm
systemd-path
10304
0755
edit
dl
rm
systemd-resolve
88136
0755
edit
dl
rm
systemd-run
43080
0755
edit
dl
rm
systemd-socket-activate
18504
0755
edit
dl
rm
systemd-stdio-bridge
14408
0755
edit
dl
rm
systemd-umount
43104
0755
edit
dl
rm
tabs
14328
0755
edit
dl
rm
tac
39096
0755
edit
dl
rm
tail
67832
0755
edit
dl
rm
taskset
30800
0755
edit
dl
rm
tee
35032
0755
edit
dl
rm
test
47288
0755
edit
dl
rm
tic
84080
0755
edit
dl
rm
timedatectl
815
0755
edit
dl
rm
timedatectl.real
22600
0755
edit
dl
rm
timeout
39552
0755
edit
dl
rm
tload
14424
0755
edit
dl
rm
toe
14328
0755
edit
dl
rm
top
108304
0755
edit
dl
rm
touch
92680
0755
edit
dl
rm
tput
18456
0755
edit
dl
rm
tr
47288
0755
edit
dl
rm
truncate
39096
0755
edit
dl
rm
tset
22528
0755
edit
dl
rm
tsort
35000
0755
edit
dl
rm
tty
30904
0755
edit
dl
rm
tzselect
15402
0755
edit
dl
rm
ucf
40685
0755
edit
dl
rm
ucfq
19367
0755
edit
dl
rm
ucfr
10722
0755
edit
dl
rm
unexpand
39128
0755
edit
dl
rm
uniq
43224
0755
edit
dl
rm
unlink
30904
0755
edit
dl
rm
unshare
18712
0755
edit
dl
rm
unsquashfs
102104
0755
edit
dl
rm
update-alternatives
47112
0755
edit
dl
rm
uptime
10312
0755
edit
dl
rm
users
35000
0755
edit
dl
rm
utmpdump
22600
0755
edit
dl
rm
vcs-run
6913
0755
edit
dl
rm
vi
1112152
0755
edit
dl
rm
view
1112152
0755
edit
dl
rm
vim.tiny
1112152
0755
edit
dl
rm
vmstat
34912
0755
edit
dl
rm
w
18504
0755
edit
dl
rm
w.procps
18504
0755
edit
dl
rm
wall
30800
2755
edit
dl
rm
watch
22952
0755
edit
dl
rm
wc
43200
0755
edit
dl
rm
whereis
27144
0755
edit
dl
rm
which
946
0755
edit
dl
rm
who
51416
0755
edit
dl
rm
whoami
30904
0755
edit
dl
rm
wpa_passphrase
63488
0755
edit
dl
rm
x86_64
18784
0755
edit
dl
rm
xargs
71896
0755
edit
dl
rm
xdg-open
38
0755
edit
dl
rm
xdg-settings
1723
0755
edit
dl
rm
xxd
18552
0755
edit
dl
rm
yes
30904
0755
edit
dl
rm
zdump
18488
0755
edit
dl
rm
[
51384
0755
edit
dl
rm
Edit:
/snap/core18/2979/usr/bin/tzselect
(15402B)
#!/bin/bash PKGVERSION="(Ubuntu GLIBC 2.27-3ubuntu1.6+esm5) " TZVERSION="2.27" REPORT_BUGS_TO="<https://bugs.launchpad.net/ubuntu/+source/glibc/+bugs>" # Ask the user about the time zone, and output the resulting TZ value to stdout. # Interact with the user via stderr and stdin. # Contributed by Paul Eggert. This file is in the public domain. # Porting notes: # # This script requires a Posix-like shell and prefers the extension of a # 'select' statement. The 'select' statement was introduced in the # Korn shell and is available in Bash and other shell implementations. # If your host lacks both Bash and the Korn shell, you can get their # source from one of these locations: # # Bash <http://www.gnu.org/software/bash/bash.html> # Korn Shell <http://www.kornshell.com/> # Public Domain Korn Shell <http://www.cs.mun.ca/~michael/pdksh/> # # For portability to Solaris 9 /bin/sh this script avoids some POSIX # features and common extensions, such as $(...) (which works sometimes # but not others), $((...)), and $10. # # This script also uses several features of modern awk programs. # If your host lacks awk, or has an old awk that does not conform to Posix, # you can use either of the following free programs instead: # # Gawk (GNU awk) <http://www.gnu.org/software/gawk/> # mawk <http://invisible-island.net/mawk/> # Specify default values for environment variables if they are unset. : ${AWK=awk} : ${TZDIR=/usr/share/zoneinfo} # Output one argument as-is to standard output. # Safer than 'echo', which can mishandle '\' or leading '-'. say() { printf '%s\n' "$1" } # Check for awk Posix compliance. ($AWK -v x=y 'BEGIN { exit 123 }') </dev/null >/dev/null 2>&1 [ $? = 123 ] || { say >&2 "$0: Sorry, your '$AWK' program is not Posix compatible." exit 1 } coord= location_limit=10 zonetabtype=zone1970 usage="Usage: tzselect [--version] [--help] [-c COORD] [-n LIMIT] Select a time zone interactively. Options: -c COORD Instead of asking for continent and then country and then city, ask for selection from time zones whose largest cities are closest to the location with geographical coordinates COORD. COORD should use ISO 6709 notation, for example, '-c +4852+00220' for Paris (in degrees and minutes, North and East), or '-c -35-058' for Buenos Aires (in degrees, South and West). -n LIMIT Display at most LIMIT locations when -c is used (default $location_limit). --version Output version information. --help Output this help. Report bugs to $REPORT_BUGS_TO." # Ask the user to select from the function's arguments, # and assign the selected argument to the variable 'select_result'. # Exit on EOF or I/O error. Use the shell's 'select' builtin if available, # falling back on a less-nice but portable substitute otherwise. if case $BASH_VERSION in ?*) : ;; '') # '; exit' should be redundant, but Dash doesn't properly fail without it. (eval 'set --; select x; do break; done; exit') </dev/null 2>/dev/null esac then # Do this inside 'eval', as otherwise the shell might exit when parsing it # even though it is never executed. eval ' doselect() { select select_result do case $select_result in "") echo >&2 "Please enter a number in range." ;; ?*) break esac done || exit } # Work around a bug in bash 1.14.7 and earlier, where $PS3 is sent to stdout. case $BASH_VERSION in [01].*) case `echo 1 | (select x in x; do break; done) 2>/dev/null` in ?*) PS3= esac esac ' else doselect() { # Field width of the prompt numbers. select_width=`expr $# : '.*'` select_i= while : do case $select_i in '') select_i=0 for select_word do select_i=`expr $select_i + 1` printf >&2 "%${select_width}d) %s\\n" $select_i "$select_word" done ;; *[!0-9]*) echo >&2 'Please enter a number in range.' ;; *) if test 1 -le $select_i && test $select_i -le $#; then shift `expr $select_i - 1` select_result=$1 break fi echo >&2 'Please enter a number in range.' esac # Prompt and read input. printf >&2 %s "${PS3-#? }" read select_i || exit done } fi while getopts c:n:t:-: opt do case $opt$OPTARG in c*) coord=$OPTARG ;; n*) location_limit=$OPTARG ;; t*) # Undocumented option, used for developer testing. zonetabtype=$OPTARG ;; -help) exec echo "$usage" ;; -version) exec echo "tzselect $PKGVERSION$TZVERSION" ;; -*) say >&2 "$0: -$opt$OPTARG: unknown option; try '$0 --help'"; exit 1 ;; *) say >&2 "$0: try '$0 --help'"; exit 1 ;; esac done shift `expr $OPTIND - 1` case $# in 0) ;; *) say >&2 "$0: $1: unknown argument"; exit 1 ;; esac # Make sure the tables are readable. TZ_COUNTRY_TABLE=$TZDIR/iso3166.tab TZ_ZONE_TABLE=$TZDIR/$zonetabtype.tab for f in $TZ_COUNTRY_TABLE $TZ_ZONE_TABLE do <"$f" || { say >&2 "$0: time zone files are not set up correctly" exit 1 } done # If the current locale does not support UTF-8, convert data to current # locale's format if possible, as the shell aligns columns better that way. # Check the UTF-8 of U+12345 CUNEIFORM SIGN URU TIMES KI. ! $AWK 'BEGIN { u12345 = "\360\222\215\205"; exit length(u12345) != 1 }' && { tmp=`(mktemp -d) 2>/dev/null` || { tmp=${TMPDIR-/tmp}/tzselect.$$ && (umask 77 && mkdir -- "$tmp") };} && trap 'status=$?; rm -fr -- "$tmp"; exit $status' 0 HUP INT PIPE TERM && (iconv -f UTF-8 -t //TRANSLIT <"$TZ_COUNTRY_TABLE" >$tmp/iso3166.tab) \ 2>/dev/null && TZ_COUNTRY_TABLE=$tmp/iso3166.tab && iconv -f UTF-8 -t //TRANSLIT <"$TZ_ZONE_TABLE" >$tmp/$zonetabtype.tab && TZ_ZONE_TABLE=$tmp/$zonetabtype.tab newline=' ' IFS=$newline # Awk script to read a time zone table and output the same table, # with each column preceded by its distance from 'here'. output_distances=' BEGIN { FS = "\t" while (getline <TZ_COUNTRY_TABLE) if ($0 ~ /^[^#]/) country[$1] = $2 country["US"] = "US" # Otherwise the strings get too long. } function abs(x) { return x < 0 ? -x : x; } function min(x, y) { return x < y ? x : y; } function convert_coord(coord, deg, minute, ilen, sign, sec) { if (coord ~ /^[-+]?[0-9]?[0-9][0-9][0-9][0-9][0-9][0-9]([^0-9]|$)/) { degminsec = coord intdeg = degminsec < 0 ? -int(-degminsec / 10000) : int(degminsec / 10000) minsec = degminsec - intdeg * 10000 intmin = minsec < 0 ? -int(-minsec / 100) : int(minsec / 100) sec = minsec - intmin * 100 deg = (intdeg * 3600 + intmin * 60 + sec) / 3600 } else if (coord ~ /^[-+]?[0-9]?[0-9][0-9][0-9][0-9]([^0-9]|$)/) { degmin = coord intdeg = degmin < 0 ? -int(-degmin / 100) : int(degmin / 100) minute = degmin - intdeg * 100 deg = (intdeg * 60 + minute) / 60 } else deg = coord return deg * 0.017453292519943296 } function convert_latitude(coord) { match(coord, /..*[-+]/) return convert_coord(substr(coord, 1, RLENGTH - 1)) } function convert_longitude(coord) { match(coord, /..*[-+]/) return convert_coord(substr(coord, RLENGTH)) } # Great-circle distance between points with given latitude and longitude. # Inputs and output are in radians. This uses the great-circle special # case of the Vicenty formula for distances on ellipsoids. function gcdist(lat1, long1, lat2, long2, dlong, x, y, num, denom) { dlong = long2 - long1 x = cos(lat2) * sin(dlong) y = cos(lat1) * sin(lat2) - sin(lat1) * cos(lat2) * cos(dlong) num = sqrt(x * x + y * y) denom = sin(lat1) * sin(lat2) + cos(lat1) * cos(lat2) * cos(dlong) return atan2(num, denom) } # Parallel distance between points with given latitude and longitude. # This is the product of the longitude difference and the cosine # of the latitude of the point that is further from the equator. # I.e., it considers longitudes to be further apart if they are # nearer the equator. function pardist(lat1, long1, lat2, long2) { return abs(long1 - long2) * min(cos(lat1), cos(lat2)) } # The distance function is the sum of the great-circle distance and # the parallel distance. It could be weighted. function dist(lat1, long1, lat2, long2) { return gcdist(lat1, long1, lat2, long2) + pardist(lat1, long1, lat2, long2) } BEGIN { coord_lat = convert_latitude(coord) coord_long = convert_longitude(coord) } /^[^#]/ { here_lat = convert_latitude($2) here_long = convert_longitude($2) line = $1 "\t" $2 "\t" $3 sep = "\t" ncc = split($1, cc, /,/) for (i = 1; i <= ncc; i++) { line = line sep country[cc[i]] sep = ", " } if (NF == 4) line = line " - " $4 printf "%g\t%s\n", dist(coord_lat, coord_long, here_lat, here_long), line } ' # Begin the main loop. We come back here if the user wants to retry. while echo >&2 'Please identify a location' \ 'so that time zone rules can be set correctly.' continent= country= region= case $coord in ?*) continent=coord;; '') # Ask the user for continent or ocean. echo >&2 'Please select a continent, ocean, "coord", or "TZ".' quoted_continents=` $AWK ' BEGIN { FS = "\t" } /^[^#]/ { entry = substr($3, 1, index($3, "/") - 1) if (entry == "America") entry = entry "s" if (entry ~ /^(Arctic|Atlantic|Indian|Pacific)$/) entry = entry " Ocean" printf "'\''%s'\''\n", entry } ' <"$TZ_ZONE_TABLE" | sort -u | tr '\n' ' ' echo '' ` eval ' doselect '"$quoted_continents"' \ "coord - I want to use geographical coordinates." \ "TZ - I want to specify the time zone using the Posix TZ format." continent=$select_result case $continent in Americas) continent=America;; *" "*) continent=`expr "$continent" : '\''\([^ ]*\)'\''` esac ' esac case $continent in TZ) # Ask the user for a Posix TZ string. Check that it conforms. while echo >&2 'Please enter the desired value' \ 'of the TZ environment variable.' echo >&2 'For example, GST-10 is a zone named GST' \ 'that is 10 hours ahead (east) of UTC.' read TZ $AWK -v TZ="$TZ" 'BEGIN { tzname = "(<[[:alnum:]+-]{3,}>|[[:alpha:]]{3,})" time = "(2[0-4]|[0-1]?[0-9])" \ "(:[0-5][0-9](:[0-5][0-9])?)?" offset = "[-+]?" time mdate = "M([1-9]|1[0-2])\\.[1-5]\\.[0-6]" jdate = "((J[1-9]|[0-9]|J?[1-9][0-9]" \ "|J?[1-2][0-9][0-9])|J?3[0-5][0-9]|J?36[0-5])" datetime = ",(" mdate "|" jdate ")(/" time ")?" tzpattern = "^(:.*|" tzname offset "(" tzname \ "(" offset ")?(" datetime datetime ")?)?)$" if (TZ ~ tzpattern) exit 1 exit 0 }' do say >&2 "'$TZ' is not a conforming Posix time zone string." done TZ_for_date=$TZ;; *) case $continent in coord) case $coord in '') echo >&2 'Please enter coordinates' \ 'in ISO 6709 notation.' echo >&2 'For example, +4042-07403 stands for' echo >&2 '40 degrees 42 minutes north,' \ '74 degrees 3 minutes west.' read coord;; esac distance_table=`$AWK \ -v coord="$coord" \ -v TZ_COUNTRY_TABLE="$TZ_COUNTRY_TABLE" \ "$output_distances" <"$TZ_ZONE_TABLE" | sort -n | sed "${location_limit}q" ` regions=`say "$distance_table" | $AWK ' BEGIN { FS = "\t" } { print $NF } '` echo >&2 'Please select one of the following' \ 'time zone regions,' echo >&2 'listed roughly in increasing order' \ "of distance from $coord". doselect $regions region=$select_result TZ=`say "$distance_table" | $AWK -v region="$region" ' BEGIN { FS="\t" } $NF == region { print $4 } '` ;; *) # Get list of names of countries in the continent or ocean. countries=`$AWK \ -v continent="$continent" \ -v TZ_COUNTRY_TABLE="$TZ_COUNTRY_TABLE" \ ' BEGIN { FS = "\t" } /^#/ { next } $3 ~ ("^" continent "/") { ncc = split($1, cc, /,/) for (i = 1; i <= ncc; i++) if (!cc_seen[cc[i]]++) cc_list[++ccs] = cc[i] } END { while (getline <TZ_COUNTRY_TABLE) { if ($0 !~ /^#/) cc_name[$1] = $2 } for (i = 1; i <= ccs; i++) { country = cc_list[i] if (cc_name[country]) { country = cc_name[country] } print country } } ' <"$TZ_ZONE_TABLE" | sort -f` # If there's more than one country, ask the user which one. case $countries in *"$newline"*) echo >&2 'Please select a country' \ 'whose clocks agree with yours.' doselect $countries country=$select_result;; *) country=$countries esac # Get list of names of time zone rule regions in the country. regions=`$AWK \ -v country="$country" \ -v TZ_COUNTRY_TABLE="$TZ_COUNTRY_TABLE" \ ' BEGIN { FS = "\t" cc = country while (getline <TZ_COUNTRY_TABLE) { if ($0 !~ /^#/ && country == $2) { cc = $1 break } } } /^#/ { next } $1 ~ cc { print $4 } ' <"$TZ_ZONE_TABLE"` # If there's more than one region, ask the user which one. case $regions in *"$newline"*) echo >&2 'Please select one of the following' \ 'time zone regions.' doselect $regions region=$select_result;; *) region=$regions esac # Determine TZ from country and region. TZ=`$AWK \ -v country="$country" \ -v region="$region" \ -v TZ_COUNTRY_TABLE="$TZ_COUNTRY_TABLE" \ ' BEGIN { FS = "\t" cc = country while (getline <TZ_COUNTRY_TABLE) { if ($0 !~ /^#/ && country == $2) { cc = $1 break } } } /^#/ { next } $1 ~ cc && $4 == region { print $3 } ' <"$TZ_ZONE_TABLE"` esac # Make sure the corresponding zoneinfo file exists. TZ_for_date=$TZDIR/$TZ <"$TZ_for_date" || { say >&2 "$0: time zone files are not set up correctly" exit 1 } esac # Use the proposed TZ to output the current date relative to UTC. # Loop until they agree in seconds. # Give up after 8 unsuccessful tries. extra_info= for i in 1 2 3 4 5 6 7 8 do TZdate=`LANG=C TZ="$TZ_for_date" date` UTdate=`LANG=C TZ=UTC0 date` TZsec=`expr "$TZdate" : '.*:\([0-5][0-9]\)'` UTsec=`expr "$UTdate" : '.*:\([0-5][0-9]\)'` case $TZsec in $UTsec) extra_info=" Selected time is now: $TZdate. Universal Time is now: $UTdate." break esac done # Output TZ info and ask the user to confirm. echo >&2 "" echo >&2 "The following information has been given:" echo >&2 "" case $country%$region%$coord in ?*%?*%) say >&2 " $country$newline $region";; ?*%%) say >&2 " $country";; %?*%?*) say >&2 " coord $coord$newline $region";; %%?*) say >&2 " coord $coord";; *) say >&2 " TZ='$TZ'" esac say >&2 "" say >&2 "Therefore TZ='$TZ' will be used.$extra_info" say >&2 "Is the above information OK?" doselect Yes No ok=$select_result case $ok in Yes) break esac do coord= done case $SHELL in *csh) file=.login line="setenv TZ '$TZ'";; *) file=.profile line="TZ='$TZ'; export TZ" esac test -t 1 && say >&2 " You can make this change permanent for yourself by appending the line $line to the file '$file' in your home directory; then log out and log in again. Here is that TZ value again, this time on standard output so that you can use the $0 command in shell scripts:" say "$TZ"
Save
cmd:
run