1147495Sgad#- 2147495Sgad# Copyright (c) 2005 - Garance Alistair Drosehn <gad@FreeBSD.org>. 3147495Sgad# All rights reserved. 4147495Sgad# 5147495Sgad# Redistribution and use in source and binary forms, with or without 6147495Sgad# modification, are permitted provided that the following conditions 7147495Sgad# are met: 8147495Sgad# 1. Redistributions of source code must retain the above copyright 9147495Sgad# notice, this list of conditions and the following disclaimer. 10147495Sgad# 2. Redistributions in binary form must reproduce the above copyright 11147495Sgad# notice, this list of conditions and the following disclaimer in the 12147495Sgad# documentation and/or other materials provided with the distribution. 13147495Sgad# 14147495Sgad# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 15147495Sgad# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 16147495Sgad# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 17147495Sgad# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 18147495Sgad# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 19147495Sgad# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 20147495Sgad# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 21147495Sgad# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 22147495Sgad# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 23147495Sgad# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 24147495Sgad# SUCH DAMAGE. 25147495Sgad# 26147495Sgad# $FreeBSD$ 27147495Sgad# 28147495Sgad 29147495Sgadtestpgm=/usr/bin/env 30147495Sgadgblenv=PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/bin 31147495Sgadgblenv=TESTVAR=Global-TV-Value 32147495Sgadgblenv=OUTSIDEVAR=OutsideValue 33147495Sgad 34147495Sgad# These first two tests are testing how well the regression-script itself is 35147495Sgad# handling environment-variables, as much as testing the `env' program. 36147495Sgad[test] 37147495Sgad sb_args:/bin/sh 38147495Sgad setenv:TESTVAR=a1a 39147495Sgad script:/bin/echo A-${TESTVAR}-Z 40147495Sgad stdout:A-a1a-Z 41147495Sgad[run] 42147495Sgad[test] 43147495Sgad sb_args:-S /bin/sh 44147495Sgad script:/bin/echo A-${TESTVAR}-Z 45147495Sgad stdout:A-Global-TV-Value-Z 46147495Sgad[run] 47147495Sgad 48147495Sgad[test] 49147495Sgad sb_args:-S TESTVAR=bb22bb /bin/sh 50147495Sgad script:/bin/echo A-${TESTVAR}-Z 51147495Sgad stdout:A-bb22bb-Z 52147495Sgad[run] 53147495Sgad[test] 54147495Sgad sb_args:-S\_TESTVAR=ab22ab\_/bin/sh 55147495Sgad script:/bin/echo A-${TESTVAR}-Z 56147495Sgad stdout:A-ab22ab-Z 57147495Sgad[run] 58147495Sgad[test] 59147495Sgad sb_args:-S\_TESTVAR="abc\_33\_abc"\_/bin/sh 60147495Sgad script:/bin/echo A-${TESTVAR}-Z 61147495Sgad stdout:A-abc 33 abc-Z 62147495Sgad[run] 63147495Sgad 64147495Sgad# First we see that 'sh' can not be found in /usr/sbin, and then 65147495Sgad# we show that it can be found without changing PATH by using -P 66147495Sgad# And then show that it can be NOT found by using -P... 67147495Sgad[test] 68147495Sgad sb_args:-S sh 69147495Sgad setenv:PATH=/usr/sbin 70147495Sgad script:/bin/echo A-${PATH}-Z 71147495Sgad $?:127 72147495Sgad stderr:[%-testpgm.basename-%]: sh: No such file or directory 73147495Sgad[run] 74147495Sgad[test] 75147495Sgad sb_args:-S -P/bin sh 76147495Sgad setenv:PATH=/usr/sbin 77147495Sgad script:/bin/echo A-${PATH}-Z 78147495Sgad stdout:A-/usr/sbin-Z 79147495Sgad[run] 80147495Sgad[test] 81147495Sgad sb_args:-S -P/sbin:/usr/sbin sh 82147495Sgad script:/bin/echo A-${PATH}-Z 83147495Sgad $?:127 84147495Sgad stderr:[%-testpgm.basename-%]: sh: No such file or directory 85147495Sgad[run] 86147495Sgad 87147495Sgad# Hmm. I wonder if -P should always set an 'ENV_PATH' variable? 88147495Sgad[test] 89147495Sgad sb_args:-S -P/bin:/usr/bin:${PATH} ENV_PATH=/bin:/usr/bin:${PATH} sh 90147495Sgad setenv:PATH=/usr/sbin 91147495Sgad script:/bin/echo A-${PATH}-Z 92147495Sgad script:/bin/echo B-${ENV_PATH}-Y 93147495Sgad stdout:A-/usr/sbin-Z 94147495Sgad stdout:B-/bin:/usr/bin:/usr/sbin-Y 95147495Sgad[run] 96147495Sgad 97147495Sgad# Show that the comment-characters are working, both for where they are 98147495Sgad# recognized and where they are ignored. 99147495Sgad[test] 100147495Sgad sb_args:-STESTVAR="abc44abc" /bin/sh # This is some arbitrary text 101147495Sgad user_args:us11er us22er 102147495Sgad script:/bin/echo A-${TESTVAR}-Z B-$1-Y 103147495Sgad stdout:A-abc44abc-Z B-us11er-Y 104147495Sgad[run] 105147495Sgad[test] 106147495Sgad sb_args:-STESTVAR="abc55abc" /bin/sh \c This is some arbitrary text 107147495Sgad user_args:us11er us22er 108147495Sgad script:/bin/echo A-${TESTVAR}-Z B-$1-Y 109147495Sgad stdout:A-abc55abc-Z B-us11er-Y 110147495Sgad[run] 111147495Sgad[test] 112147495Sgad sb_args:-STESTVAR=abc#44#abc /bin/sh 113147495Sgad user_args:us11er us22er 114147495Sgad script:/bin/echo A-${TESTVAR}-Z B-$1-Y 115147495Sgad stdout:A-abc#44#abc-Z B-us11er-Y 116147495Sgad[run] 117147495Sgad[test] 118147495Sgad sb_args:-STESTVAR='abc\c55\cabc' /bin/sh 119147495Sgad user_args:us11er us22er 120147495Sgad script:/bin/echo A-${TESTVAR}-Z B-$1-Y 121147495Sgad stdout:A-abc\c55\cabc-Z B-us11er-Y 122147495Sgad[run] 123147495Sgad 124147495Sgad# Test various aspects of quoted strings 125147495Sgad[test] 126147495Sgad sb_args:-STESTVAR="abc'def" /bin/sh 127147495Sgad script:/bin/echo A-${TESTVAR}-Z 128147495Sgad stdout:A-abc'def-Z 129147495Sgad[run] 130147495Sgad[test] 131147495Sgad sb_args:-STESTVAR='abc"def' /bin/sh 132147495Sgad script:/bin/echo A-${TESTVAR}-Z 133147495Sgad stdout:A-abc"def-Z 134147495Sgad[run] 135147495Sgad[test] 136147495Sgad sb_args:-STESTVAR='ab\'cd\'ef' /bin/sh 137147495Sgad script:/bin/echo A-${TESTVAR}-Z 138147495Sgad stdout:A-ab'cd'ef-Z 139147495Sgad[run] 140147495Sgad[test] 141147495Sgad sb_args:-STESTVAR='abc\"def\'ghi' /bin/sh 142147495Sgad script:/bin/echo A-${TESTVAR}-Z 143147495Sgad stdout:A-abc\"def'ghi-Z 144147495Sgad[run] 145147495Sgad[test] 146147495Sgad sb_args:-STESTVAR='abc''def''ghi' /bin/sh 147147495Sgad script:/bin/echo A-${TESTVAR}-Z 148147495Sgad stdout:A-abcdefghi-Z 149147495Sgad[run] 150147495Sgad[test] 151147495Sgad sb_args:-STESTVAR='abc\ndef\nghi' /bin/sh 152147495Sgad script:/bin/echo "A-${TESTVAR}-Z" 153147495Sgad stdout:A-abc\ndef\nghi-Z 154147495Sgad[run] 155147495Sgad[test] 156147495Sgad sb_args:-STESTVAR="abc\ndef\nghi" /bin/sh 157147495Sgad script:/bin/echo "A-${TESTVAR}-Z" 158147495Sgad stdout:A-abc 159147495Sgad stdout:def 160147495Sgad stdout:ghi-Z 161147495Sgad[run] 162147495Sgad[test] 163147495Sgad sb_args:-STESTVAR=""\_OTHERVAR=""\_/bin/sh 164147495Sgad script:/bin/echo A-${TESTVAR}-M-${OTHERVAR}-Z 165147495Sgad stdout:A--M--Z 166147495Sgad[run] 167147495Sgad[test] 168147495Sgad sb_args:-STESTVAR=no-term-"-dq... /bin/sh 169147495Sgad script:/bin/echo "A-${TESTVAR}-Z" 170147495Sgad $?:1 171147495Sgad stderr:[%-testpgm.basename-%]: No terminating quote for string: TESTVAR=no-term-"-dq... /bin/sh 172147495Sgad[run] 173147495Sgad[test] 174147495Sgad sb_args:-STESTVAR=no-term-'-sq... /bin/sh 175147495Sgad script:/bin/echo "A-${TESTVAR}-Z" 176147495Sgad $?:1 177147495Sgad stderr:[%-testpgm.basename-%]: No terminating quote for string: TESTVAR=no-term-'-sq... /bin/sh 178147495Sgad[run] 179147495Sgad 180147495Sgad# Some tests of variable-substitution. 181147495Sgad[test] 182147495Sgad sb_args:-S TESTVAR=${TEST7} /bin/sh 183147495Sgad setenv:TEST7=a23456a 184147495Sgad script:/bin/echo "A-${TESTVAR}-Z" 185147495Sgad stdout:A-a23456a-Z 186147495Sgad[run] 187147495Sgad[test] 188147495Sgad sb_args:-S TESTVAR=${TEST8} /bin/sh 189147495Sgad setenv:TEST8=b234567b 190147495Sgad script:/bin/echo "A-${TESTVAR}-Z" 191147495Sgad stdout:A-b234567b-Z 192147495Sgad[run] 193147495Sgad[test] 194147495Sgad sb_args:-S TESTVAR=${TEST9} /bin/sh 195147495Sgad setenv:TEST9=c2345678c 196147495Sgad script:/bin/echo "A-${TESTVAR}-Z" 197147495Sgad stdout:A-c2345678c-Z 198147495Sgad[run] 199147495Sgad[test] 200147495Sgad sb_args:-S TESTVAR=${TEST8}+${TEST9}+${TEST10} /bin/sh 201147495Sgad setenv:TEST8=a234567z 202147495Sgad setenv:TEST9=a2345678z 203147495Sgad setenv:TEST10=a23456789z 204147495Sgad script:/bin/echo "A-${TESTVAR}-Z" 205147495Sgad stdout:A-a234567z+a2345678z+a23456789z-Z 206147495Sgad[run] 207147495Sgad[test] 208147495Sgad sb_args:-S TESTVAR=$* /bin/sh 209147495Sgad script:/bin/echo "A-${TESTVAR}-Z" 210147495Sgad $?:1 211147495Sgad stderr:[%-testpgm.basename-%]: Only ${VARNAME} expansion is supported, error at: $* /bin/sh 212147495Sgad[run] 213147495Sgad[test] 214147495Sgad sb_args:-S TESTVAR=/usr/bin:$PATH /bin/sh 215147495Sgad script:/bin/echo "A-${TESTVAR}-Z" 216147495Sgad $?:1 217147495Sgad stderr:[%-testpgm.basename-%]: Only ${VARNAME} expansion is supported, error at: $PATH /bin/sh 218147495Sgad[run] 219147495Sgad 220147522Sgad# For a short time `env' was changed to recognize 'something=value' as a 221147522Sgad# valid utility name if 'something' begins with a '/'. However, that was 222147522Sgad# a bad idea, since variable-names with a '/' -- while rare -- are still 223147522Sgad# more blessed by standards than a filename with an '=' in it. So, this 224147522Sgad# test goes back to expecting an error... 225147495Sgad[test] 226147495Sgad symlink:/bin/echo /tmp/envtest=echo 227147495Sgad sb_args:-S/tmp/envtest=echo false 228147522Sgad $?:1 229147495Sgad[run] 230147495Sgad 231147495Sgad# Show interactions between -i (clear environment), and ${VAR} substitution, 232147495Sgad# and that -i will clear the environment at the right point in processing... 233147495Sgad[test] 234147495Sgad sb_args:-iS PATH=/bin:/usr/bin:/Not WASPATH=${PATH} WASOUT=${OUTSIDEVAR} TESTVAR=SbValue WASTEST=${TESTVAR} /bin/sh 235147495Sgad script:/bin/echo "=== set ===" 236147495Sgad script:# drop some environment variables that 'sh' itself sets, and 237147495Sgad script:# then have 'set' print out all remaining environment variables. 238280002Sjilles script:# (can't unset OPTIND/PWD, so we use grep to get rid of those) 239280002Sjilles script:unset -v IFS PS1 PS2 PS4 PPID 240280002Sjilles script:set | grep -Ev '^(OPTIND|PWD)=' | sort 241147495Sgad stdout:=== set === 242147495Sgad stdout:PATH=/bin:/usr/bin:/Not 243147495Sgad stdout:TESTVAR=SbValue 244147495Sgad stdout:WASOUT=OutsideValue 245147495Sgad stdout:WASPATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/bin 246147495Sgad stdout:WASTEST=Global-TV-Value 247147495Sgad[run] 248147522Sgad 249147522Sgad# Had a bug with ${VAR} expansion if the character before the $ was 250147522Sgad# one of the argument-separator characters. So the first of the 251147522Sgad# following worked, but the second one failed: 252147522Sgad[test] 253147522Sgad sb_args:-Secho Testv:${TESTV} Scriptname: 254147522Sgad setenv:TESTV=ab/ba 255147522Sgad stdout:Testv:ab/ba Scriptname: [%-script.pathname-%] 256147522Sgad[run] 257147522Sgad[test] 258147522Sgad sb_args:-Secho testV: ${TESTV} scriptname: 259147522Sgad setenv:TESTV=cd/dc 260147522Sgad stdout:testV: cd/dc scriptname: [%-script.pathname-%] 261147522Sgad[run] 262147522Sgad 263147522Sgad# A "nothing variable" inside a quoted string should produce a zero-length 264147522Sgad# argument, but if it's outside of quotes then it should result in, well, 265147522Sgad# nothing. Note the tricks we play with [%-script.pathname-%] so that we 266147522Sgad# can supply parameters *to* the script, even though the kernel is always 267147522Sgad# going to stick the script name on as ARG[2] when invoking `env'. 268147522Sgad[test] 269147522Sgad sb_args:-S/bin/sh [%-script.pathname-%] userDQ: "" SQ: '' scriptname: 270147522Sgad setenv:TNADA= 271147522Sgad script:printf "list_args.sh with \$# = $#\n" 272147522Sgad script:# Process all parameters. 273147522Sgad script:N=0 274147522Sgad script:while test $# != 0 ; do 275147522Sgad script: N=$(($N+1)) 276147522Sgad script: printf "....\$$N = [%3d] '$1'\n" ${#1} 277147522Sgad script: shift 278147522Sgad script:done 279147522Sgad stdout:list_args.sh with $# = 6 280147522Sgad stdout:....$1 = [ 7] 'userDQ:' 281147522Sgad stdout:....$2 = [ 0] '' 282147522Sgad stdout:....$3 = [ 3] 'SQ:' 283147522Sgad stdout:....$4 = [ 0] '' 284147522Sgad stdout:....$5 = [ 11] 'scriptname:' 285147522Sgad stdout:....$6 = [ 16] '/tmp/env-regress' 286147522Sgad[run] 287147522Sgad[test] 288147522Sgad sb_args:-S/bin/sh [%-script.pathname-%] userB "${TNADA}" scriptname: 289147522Sgad setenv:TNADA= 290147522Sgad script:printf "list_args.sh with \$# = $#\n" 291147522Sgad script:# Process all parameters. 292147522Sgad script:N=0 293147522Sgad script:while test $# != 0 ; do 294147522Sgad script: N=$(($N+1)) 295147522Sgad script: printf "....\$$N = [%3d] '$1'\n" ${#1} 296147522Sgad script: shift 297147522Sgad script:done 298147522Sgad stdout:list_args.sh with $# = 4 299147522Sgad stdout:....$1 = [ 5] 'userB' 300147522Sgad stdout:....$2 = [ 0] '' 301147522Sgad stdout:....$3 = [ 11] 'scriptname:' 302147522Sgad stdout:....$4 = [ 16] '/tmp/env-regress' 303147522Sgad[run] 304147522Sgad[test] 305147522Sgad sb_args:-S/bin/sh [%-script.pathname-%] userA ${TNADA} scriptname: 306147522Sgad setenv:TNADA= 307147522Sgad script:printf "list_args.sh with \$# = $#\n" 308147522Sgad script:# Process all parameters. 309147522Sgad script:N=0 310147522Sgad script:while test $# != 0 ; do 311147522Sgad script: N=$(($N+1)) 312147522Sgad script: printf "....\$$N = [%3d] '$1'\n" ${#1} 313147522Sgad script: shift 314147522Sgad script:done 315147522Sgad stdout:list_args.sh with $# = 3 316147522Sgad stdout:....$1 = [ 5] 'userA' 317148024Sgad stdout:....$2 = [ 11] 'scriptname:' 318147522Sgad stdout:....$3 = [ 16] '[%-script.pathname-%]' 319147522Sgad[run] 320148024Sgad[test] 321148024Sgad sb_args:-S/bin/sh [%-script.pathname-%] ${A} ${NB} ${C} ${ND} ${NE} ${F} S: 322148024Sgad setenv:A=A_ThisisAlongstring_A1 323148024Sgad setenv:NB= 324148024Sgad setenv:C=C_ThisisAlongstring_C1 325148024Sgad setenv:ND= 326148024Sgad setenv:NE= 327148024Sgad setenv:F=F_ThisisAlongstring_F1 328148024Sgad script:printf "list_args.sh with \$# = $#\n" 329148024Sgad script:# Process all parameters. 330148024Sgad script:N=0 331148024Sgad script:while test $# != 0 ; do 332148024Sgad script: N=$(($N+1)) 333148024Sgad script: printf "....\$$N = [%3d] '$1'\n" ${#1} 334148024Sgad script: shift 335148024Sgad script:done 336148024Sgad stdout:list_args.sh with $# = 5 337148024Sgad stdout:....$1 = [ 22] 'A_ThisisAlongstring_A1' 338148024Sgad stdout:....$2 = [ 22] 'C_ThisisAlongstring_C1' 339148024Sgad stdout:....$3 = [ 22] 'F_ThisisAlongstring_F1' 340148024Sgad stdout:....$4 = [ 2] 'S:' 341148024Sgad stdout:....$5 = [ 16] '/tmp/env-regress' 342148024Sgad[run] 343148024Sgad[test] 344148024Sgad sb_args:-S/bin/sh [%-script.pathname-%] ${A} ${NB} "${NB}" ${NB} ${C} "${ND}" ${NE} ${F} S: 345148024Sgad setenv:A=A_ThisisAlongstring_A1 346148024Sgad setenv:NB= 347148024Sgad setenv:C=C_ThisisAlongstring_C1 348148024Sgad setenv:ND= 349148024Sgad setenv:NE= 350148024Sgad setenv:F=F_ThisisAlongstring_F1 351148024Sgad script:printf "list_args.sh with \$# = $#\n" 352148024Sgad script:# Process all parameters. 353148024Sgad script:N=0 354148024Sgad script:while test $# != 0 ; do 355148024Sgad script: N=$(($N+1)) 356148024Sgad script: printf "....\$$N = [%3d] '$1'\n" ${#1} 357148024Sgad script: shift 358148024Sgad script:done 359148024Sgad stdout:list_args.sh with $# = 7 360148024Sgad stdout:....$1 = [ 22] 'A_ThisisAlongstring_A1' 361148024Sgad stdout:....$2 = [ 0] '' 362148024Sgad stdout:....$3 = [ 22] 'C_ThisisAlongstring_C1' 363148024Sgad stdout:....$4 = [ 0] '' 364148024Sgad stdout:....$5 = [ 22] 'F_ThisisAlongstring_F1' 365148024Sgad stdout:....$6 = [ 2] 'S:' 366148024Sgad stdout:....$7 = [ 16] '/tmp/env-regress' 367148024Sgad[run] 368148024Sgad 369148024Sgad[test] 370148024Sgad sb_args:-S/bin/echo ${A} ${B} ${C} ${D} ScriptName: 371148024Sgad setenv:A=A_ThisisAlongstring_A1 372148024Sgad setenv:B=B_ThisisAlongstring_B1 373148024Sgad setenv:C=C_ThisisAlongstring_C1 374148024Sgad setenv:D=D_ThisisAlongstring_D1 375148024Sgad stdout:A_ThisisAlongstring_A1 B_ThisisAlongstring_B1 C_ThisisAlongstring_C1 D_ThisisAlongstring_D1 ScriptName: [%-script.pathname-%] 376148024Sgad[run] 377148024Sgad[test] 378148024Sgad sb_args:-S/bin/echo ${A} "${B}" ${C} "${D}" ScriptName: 379148024Sgad setenv:A=A_ThisisAlongstring_A1 380148024Sgad setenv:B=B_ThisisAlongstring_B1 381148024Sgad setenv:C=C_ThisisAlongstring_C1 382148024Sgad setenv:D=D_ThisisAlongstring_D1 383148024Sgad stdout:A_ThisisAlongstring_A1 B_ThisisAlongstring_B1 C_ThisisAlongstring_C1 D_ThisisAlongstring_D1 ScriptName: [%-script.pathname-%] 384148024Sgad[run] 385280027Sjilles 386280027Sjilles[test] 387280027Sjilles sb_args:sh 388280027Sjilles script:[%-testpgm.pathname-%] -S '\c' >/dev/null 389280027Sjilles[run] 390280027Sjilles[test] 391280027Sjilles sb_args:sh 392280027Sjilles script:[%-testpgm.pathname-%] -S'\c' >/dev/null 393280027Sjilles[run] 394280027Sjilles[test] 395280027Sjilles sb_args:sh 396280027Sjilles script:[%-testpgm.pathname-%] -u foo -S '\c' >/dev/null 397280027Sjilles[run] 398280027Sjilles[test] 399280027Sjilles sb_args:sh 400280027Sjilles script:[%-testpgm.pathname-%] -u foo -S'\c' >/dev/null 401280027Sjilles[run] 402280027Sjilles[test] 403280027Sjilles sb_args:sh 404280027Sjilles script:[%-testpgm.pathname-%] -S '-u bar \c' >/dev/null 405280027Sjilles[run] 406280027Sjilles[test] 407280027Sjilles sb_args:sh 408280027Sjilles script:[%-testpgm.pathname-%] -S'-u bar \c' >/dev/null 409280027Sjilles[run] 410280027Sjilles[test] 411280027Sjilles sb_args:sh 412280027Sjilles script:[%-testpgm.pathname-%] -u foo -S '-u bar \c' >/dev/null 413280027Sjilles[run] 414280027Sjilles[test] 415280027Sjilles sb_args:sh 416280027Sjilles script:[%-testpgm.pathname-%] -u foo -S'-u bar \c' >/dev/null 417280027Sjilles[run] 418