220 lines
5.7 KiB
YAML
220 lines
5.7 KiB
YAML
name: "Well-known variable tests"
|
|
cases:
|
|
- name: "Basic defaulted PATH var"
|
|
stdin: |
|
|
if [[ -z "$PATH" ]]; then
|
|
echo "PATH is not set or is empty"
|
|
else
|
|
echo "PATH is set and non-empty"
|
|
fi
|
|
|
|
- name: "Basic variables"
|
|
known_failure: true # Not fully implemented
|
|
stdin: |
|
|
declare -p > ./vars.txt
|
|
# Filter out variables set by test infrastructure.
|
|
# Filter out brush-specific variables.
|
|
cat vars.txt | grep '^declare ' | grep -v LLVM | grep -v BRUSH | sed -e 's/=.*//'
|
|
rm vars.txt
|
|
|
|
- name: "Static well-known variables"
|
|
stdin: |
|
|
echo "EUID: $EUID"
|
|
echo "UID: $UID"
|
|
|
|
[[ $BASHPID == $$ ]]
|
|
echo 'BASHPID == \$$: ' $?
|
|
|
|
[[ $BASH_ARGV0 == $0 ]]
|
|
echo 'BASH_ARGV0 == $0: ' $?
|
|
|
|
[[ $MACHTYPE == ${BASH_VERSINFO[5]} ]]
|
|
echo 'MACHTYPE == ${BASH_VERSINFO[5]: ' $?
|
|
|
|
- name: "OSTYPE pattern match for current platform"
|
|
stdin: |
|
|
case "$OSTYPE" in
|
|
linux*) echo "prefix=linux" ;;
|
|
darwin*) echo "prefix=darwin" ;;
|
|
freebsd*) echo "prefix=freebsd" ;;
|
|
netbsd*) echo "prefix=netbsd" ;;
|
|
openbsd*) echo "prefix=openbsd" ;;
|
|
dragonfly*) echo "prefix=dragonfly" ;;
|
|
solaris*) echo "prefix=solaris" ;;
|
|
cygwin*|msys*|windows*)
|
|
echo "prefix=windows-like" ;;
|
|
*) echo "prefix=other:$OSTYPE" ;;
|
|
esac
|
|
|
|
- name: "dollar-_"
|
|
stdin: |
|
|
# Check on start
|
|
[[ "$0" == "$_" ]] && echo '$_ matches $0 on start'
|
|
|
|
# Now do something
|
|
echo first middle last >/dev/null
|
|
echo "\$_ after first echo command: $_"
|
|
echo
|
|
echo "\$_ after second echo command: $_"
|
|
|
|
# See if a child process sees _ set to its resolved pathname.
|
|
echo "Spawning child process..."
|
|
env -v | grep '^_='
|
|
echo "\$_ after child process exited: $_"
|
|
|
|
- name: "BASH_ALIASES"
|
|
stdin: |
|
|
echo "Initial BASH_ALIASES: " ${BASH_ALIASES[@]}
|
|
alias x=y
|
|
echo "Updated BASH_ALIASES: " ${BASH_ALIASES[@]}
|
|
unalias x
|
|
echo "Final BASH_ALIASES: " ${BASH_ALIASES[@]}
|
|
|
|
- name: "BASHOPTS"
|
|
min_oracle_version: "5.3" # Changed in bash 5.3
|
|
stdin: |
|
|
# Workaround for brush forcing on extglob
|
|
shopt -u extglob
|
|
|
|
echo "BASHOPTS: $BASHOPTS"
|
|
|
|
- name: "BASH_SOURCE"
|
|
max_oracle_version: "5.2" # Behavior changed in bash 5.3; still needs investigation
|
|
stdin: |
|
|
echo "Input entry"; declare -p BASH_SOURCE
|
|
|
|
function myfunc() {
|
|
echo "In function: \$1: $1"
|
|
declare -p BASH_SOURCE
|
|
|
|
if [[ $1 -gt 0 ]]; then
|
|
myfunc $(( $1 - 1 ))
|
|
fi
|
|
}
|
|
|
|
myfunc 4
|
|
|
|
echo "Input exit"; declare -p BASH_SOURCE
|
|
|
|
- name: "FUNCNAME"
|
|
stdin: |
|
|
echo "Input entry"; declare -p FUNCNAME
|
|
|
|
function myfunc() {
|
|
echo "In function: \$1: $1"
|
|
declare -p FUNCNAME
|
|
|
|
if [[ $1 -gt 0 ]]; then
|
|
myfunc $(( $1 - 1 ))
|
|
fi
|
|
}
|
|
|
|
myfunc 4
|
|
|
|
echo "Input exit"; declare -p FUNCNAME
|
|
|
|
- name: "BASH_SUBSHELL"
|
|
stdin: |
|
|
echo "Initial BASH_SUBSHELL: $BASH_SUBSHELL"
|
|
(echo "Subshell BASH_SUBSHELL: $BASH_SUBSHELL")
|
|
(
|
|
( echo "Nested subshell BASH_SUBSHELL: $BASH_SUBSHELL" )
|
|
)
|
|
|
|
echo $(echo "Command substitution BASH_SUBSHELL: $BASH_SUBSHELL")
|
|
|
|
- name: "BASH_VERSINFO"
|
|
stdin: |
|
|
shopt -s extglob
|
|
|
|
echo "len(BASH_VERSINFO): " ${#BASH_VERSINFO[@]}
|
|
|
|
# Only inspect the first 4 elements.
|
|
for ((i = 0; i < 4; i++)); do
|
|
cleaned=${BASH_VERSINFO[i]//+([0-9])/d}
|
|
echo "Cleaned BASH_VERSINFO[$i]: $cleaned"
|
|
done
|
|
|
|
- name: "BASH_VERSION"
|
|
stdin: |
|
|
shopt -s extglob
|
|
|
|
# Replace specific numbers with placeholder text.
|
|
cleaned=${BASH_VERSION//+([0-9])/d}
|
|
echo "Cleaned BASH_VERSION: $cleaned"
|
|
|
|
- name: "COMP_WORDBREAKS"
|
|
stdin: |
|
|
dump_var() {
|
|
echo -n "COMP_WORDBREAKS:"
|
|
for ((i=0; i<${#COMP_WORDBREAKS}; i++)); do
|
|
c="${COMP_WORDBREAKS:i:1}"
|
|
echo " ${c@Q}"
|
|
done | sort
|
|
}
|
|
|
|
dump_var
|
|
|
|
- name: "EPOCHSECONDS"
|
|
stdin: |
|
|
external=$(date +%s)
|
|
|
|
es1=${EPOCHSECONDS}
|
|
[[ $es1 =~ ^[0-9]+$ ]] && echo "EPOCHSECONDS is a number"
|
|
|
|
es2=${EPOCHSECONDS}
|
|
[[ $es2 =~ ^[0-9]+$ ]] && echo "EPOCHSECONDS is still a number"
|
|
|
|
(( es1 >= external )) && echo "Time is moving forward"
|
|
(( es1 >= es2 )) && echo "Time is moving forward within the shell"
|
|
|
|
- name: "GROUPS"
|
|
skip: true # TODO(well-known-vars): macOS failure needs investigation (passes elsewhere)
|
|
stdin: |
|
|
(for group in ${GROUPS[@]}; do
|
|
echo $group
|
|
done) | sort
|
|
|
|
- name: "LINENO"
|
|
stdin: |
|
|
echo "LINENO: $LINENO"
|
|
echo "LINENO: $LINENO"
|
|
echo "LINENO: $LINENO"
|
|
|
|
- name: "LINENO with multi-line input"
|
|
stdin: |
|
|
for f in 1 2 3; do
|
|
echo "LINENO: $LINENO"
|
|
done
|
|
|
|
- name: "RANDOM"
|
|
stdin: |
|
|
first=${RANDOM}
|
|
second=${RANDOM}
|
|
|
|
[[ $first != $second ]] && echo "Confirmed RANDOM at least isn't static"
|
|
[[ $first -ge 0 && $first -lt 32768 ]] && echo "RANDOM value is within expected range"
|
|
[[ $second -ge 0 && $second -lt 32768 ]] && echo "RANDOM value is within expected range"
|
|
|
|
- name: "SHELL"
|
|
stdin: |
|
|
declare -p SHELL
|
|
echo "SHELL: $SHELL"
|
|
|
|
- name: "SHELLOPTS"
|
|
stdin: |
|
|
echo "SHELLOPTS: $SHELLOPTS"
|
|
|
|
- name: "SHLVL"
|
|
stdin: |
|
|
echo "SHLVL: $SHLVL"
|
|
bash -c 'echo "bash SHLVL: $SHLVL"'
|
|
$0 -c 'echo "nested SHLVL: $SHLVL"'
|
|
|
|
- name: "SRANDOM"
|
|
stdin: |
|
|
first=${SRANDOM}
|
|
second=${SRANDOM}
|
|
|
|
[[ $first != $second ]] && echo "Confirmed SRANDOM at least isn't static"
|