%prep mydir=$PWD SHLVL=2 setopt extendedglob %test # 'mydir=$PWD; hash -d mydir; print -P %~' doesn't seem to abbreviate # to ~mydir in a non-interactive shell. Is this correct? print -P ' %%%): %) %%d: %d %%1/: %1/ %%h: %h %%L: %L %%M: %M %%m: %m %%n: %n %%N: %N %%i: %i a%%{...%%}b: a%{%}b ' 0q:Basic prompt escapes as shown. > %): ) > %d: $mydir > %1/: ${mydir:t} > %h: 0 > %L: 2 > %M: $HOST > %m: ${HOST%%.*} > %n: $USERNAME > %N: ZTST_execchunk > %i: 2 > a%{...%}b: ab > true print -P '%?' false print -P '%?' 0:`%?' prompt escape >0 >1 PS4="%_> " setopt xtrace if true; then true; else false; fi unsetopt xtrace 0:`%_' prompt escape ?if> true ?then> true ?> unsetopt xtrace diff =(print -P '%#') =(print -P '%(!.#.%%)') 0:`%#' prompt escape and its equivalent psvar=(caesar adsum jam forte) print -P '%v' '%4v' 0:`%v' prompt escape >caesar forte true print -P '%(?.true.false)' false print -P '%(?.true.false)' 0:ternary prompt escapes >true >false print -P '%10<......>truncated at 10%>> Not truncated' 0:prompt truncation >...d at 10 Not truncated >truncat... Not truncated # It's hard to check the time and date as they are moving targets. # We therefore just check that various forms of the date are consistent. # In fact, if you perform this at midnight it can still fail. # We could test for that, but we can't be bothered. # I hope LC_ALL is enough to make the format what's expected. LC_ALL=C date1=$(print -P %w) date2=$(print -P %W) date3=$(print -P %D) if [[ $date1 != [A-Z][a-z][a-z][[:blank:]]##[0-9]## ]]; then print "Date \`$date1' is not in the form \`Day DD' (e.g. \`Mon 1'" fi if [[ $date2 != [0-9][0-9]/[0-9][0-9]/[0-9][0-9] ]]; then print "Date \`$date2' is not in the form \`DD/MM/YYYY'" fi if [[ $date3 != [0-9][0-9]-[0-9][0-9]-[0-9][0-9] ]]; then print "Date \`$date3' is not in the form \`YY-MM-DD'" fi if (( $date1[5,-1] != $date2[4,5] )) || (( $date2[4,5] != $date3[8,9] )) then print "Days of month do not agree in $date1, $date2, $date3" fi if (( $date2[1,2] != $date3[4,5] )); then print "Months do not agree in $date2, $date3" fi if (( $date2[7,8] != $date3[1,2] )); then print "Years do not agree in $date2, $date3" fi 0:Dates produced by prompt escapes