320 lines
7.4 KiB
YAML
320 lines
7.4 KiB
YAML
name: "Builtins: alias"
|
|
cases:
|
|
#
|
|
# Defining, listing, and removing aliases.
|
|
#
|
|
|
|
- name: "Basic alias usage"
|
|
stdin: |
|
|
shopt -s expand_aliases
|
|
alias myalias=echo
|
|
alias
|
|
myalias 'hello'
|
|
|
|
- name: "Alias listing"
|
|
stdin: |
|
|
alias a=echo
|
|
alias b='ls -l'
|
|
alias
|
|
echo "---"
|
|
alias -p
|
|
echo "---"
|
|
alias a
|
|
echo "exit=$?"
|
|
|
|
- name: "Alias listing is sorted by name"
|
|
stdin: |
|
|
alias e=5
|
|
alias c=3
|
|
alias a=1
|
|
alias f=6
|
|
alias d=4
|
|
alias b=2
|
|
alias
|
|
|
|
- name: "Redefining an alias"
|
|
stdin: |
|
|
shopt -s expand_aliases
|
|
alias r='echo one'
|
|
r
|
|
alias r='echo two'
|
|
r
|
|
|
|
- name: "Unalias"
|
|
stdin: |
|
|
shopt -s expand_aliases
|
|
alias x='echo aliased'
|
|
x
|
|
unalias x
|
|
x 2>/dev/null || echo "gone: $?"
|
|
|
|
- name: "Unalias all"
|
|
stdin: |
|
|
alias a=echo
|
|
alias b=echo
|
|
unalias -a
|
|
alias
|
|
echo "exit=$?"
|
|
|
|
- name: "Unalias non-existent alias"
|
|
ignore_stderr: true # brush doesn't prefix errors with script name and line
|
|
stdin: |
|
|
unalias nosuchalias
|
|
echo "exit=$?"
|
|
|
|
#
|
|
# Expansion of the alias body: quoting and word expansions.
|
|
#
|
|
|
|
- name: "Alias body with quoted args"
|
|
stdin: |
|
|
shopt -s expand_aliases
|
|
alias fmt='printf "[%s]\n" -a --format "table {{.Names}}\t{{.State}}"'
|
|
fmt
|
|
|
|
- name: "Alias body with single-quoted args"
|
|
stdin: |
|
|
shopt -s expand_aliases
|
|
alias q="printf '[%s]\n' 'a b' c"
|
|
q
|
|
|
|
- name: "Alias body with escaped chars"
|
|
stdin: |
|
|
shopt -s expand_aliases
|
|
alias esc='printf "[%s]\n" a\ b c'
|
|
esc
|
|
|
|
- name: "Alias body with ANSI-C quoting"
|
|
stdin: |
|
|
shopt -s expand_aliases
|
|
alias d='printf "[%s]\n" $'"'"'a\tb'"'"''
|
|
d
|
|
|
|
- name: "Alias body with variable expansion"
|
|
stdin: |
|
|
shopt -s expand_aliases
|
|
export MYVAR="a b"
|
|
alias e='printf "[%s]\n" $MYVAR "$MYVAR"'
|
|
e
|
|
|
|
- name: "Alias body with tilde expansion"
|
|
stdin: |
|
|
shopt -s expand_aliases
|
|
alias t='echo ~/sub'
|
|
[ "$(t)" = "$HOME/sub" ] && echo "tilde expanded"
|
|
|
|
- name: "Alias body with command substitution"
|
|
stdin: |
|
|
shopt -s expand_aliases
|
|
alias c='echo $(echo inner)'
|
|
c
|
|
|
|
- name: "Alias body with pathname expansion"
|
|
stdin: |
|
|
shopt -s expand_aliases
|
|
touch aa.txt ab.txt
|
|
alias g='printf "[%s]\n" *.txt'
|
|
g
|
|
|
|
- name: "Alias body is expanded at use time"
|
|
stdin: |
|
|
shopt -s expand_aliases
|
|
alias e='echo $MYVAR'
|
|
MYVAR=first
|
|
e
|
|
MYVAR=second
|
|
e
|
|
|
|
- name: "Alias with empty body"
|
|
stdin: |
|
|
shopt -s expand_aliases
|
|
alias empty=''
|
|
empty
|
|
echo "exit=$?"
|
|
|
|
- name: "Args are appended after the alias body"
|
|
stdin: |
|
|
shopt -s expand_aliases
|
|
alias p='printf "[%s]\n" first'
|
|
p second "third fourth"
|
|
|
|
#
|
|
# Where alias expansion applies.
|
|
#
|
|
|
|
- name: "Alias takes precedence over function"
|
|
stdin: |
|
|
shopt -s expand_aliases
|
|
myfunc() { echo function-version; }
|
|
alias myfunc='echo alias-version'
|
|
myfunc
|
|
unalias myfunc
|
|
myfunc
|
|
|
|
- name: "Alias for a command name is not recursively re-expanded"
|
|
stdin: |
|
|
shopt -s expand_aliases
|
|
alias echo='echo prefix'
|
|
echo hello
|
|
|
|
- name: "Aliases are not expanded when expand_aliases is unset"
|
|
stdin: |
|
|
alias x='echo aliased'
|
|
x 2>/dev/null || echo "not-expanded"
|
|
|
|
- name: "Alias used in a pipeline"
|
|
stdin: |
|
|
shopt -s expand_aliases
|
|
alias u='tr a-z A-Z'
|
|
echo hello | u
|
|
|
|
- name: "Alias used after && and ||"
|
|
stdin: |
|
|
shopt -s expand_aliases
|
|
alias e='echo ran'
|
|
true && e
|
|
false || e
|
|
|
|
- name: "Alias used in a function body"
|
|
stdin: |
|
|
shopt -s expand_aliases
|
|
alias body='echo from-alias'
|
|
f() { body; }
|
|
f
|
|
|
|
- name: "Alias used in a for loop body"
|
|
stdin: |
|
|
shopt -s expand_aliases
|
|
alias pr='echo item'
|
|
for i in 1 2; do pr $i; done
|
|
|
|
#
|
|
# Cases the current (execution-time) alias implementation does not handle.
|
|
# These need alias substitution to move into the tokenizer; see issue #57.
|
|
#
|
|
|
|
- name: "Quoting the command name suppresses alias expansion"
|
|
known_failure: true # Issue #57
|
|
stdin: |
|
|
shopt -s expand_aliases
|
|
alias e='echo aliased'
|
|
e
|
|
\e 2>/dev/null || echo "backslash-suppressed"
|
|
"e" 2>/dev/null || echo "quote-suppressed"
|
|
|
|
- name: "Alias body containing a pipeline"
|
|
known_failure: true # Issue #57
|
|
stdin: |
|
|
shopt -s expand_aliases
|
|
alias pl='echo hello | tr a-z A-Z'
|
|
pl
|
|
|
|
- name: "Alias body containing a redirection"
|
|
known_failure: true # Issue #57
|
|
stdin: |
|
|
shopt -s expand_aliases
|
|
alias w='echo written > out.txt'
|
|
w
|
|
cat out.txt
|
|
|
|
- name: "Alias body containing a command separator"
|
|
known_failure: true # Issue #57
|
|
stdin: |
|
|
shopt -s expand_aliases
|
|
alias two='echo one; echo two'
|
|
two
|
|
|
|
- name: "Alias defined and used on the same line"
|
|
known_failure: true # Issue #57
|
|
stdin: |
|
|
shopt -s expand_aliases
|
|
alias sl='echo same-line'; sl
|
|
|
|
- name: "Alias with trailing space"
|
|
known_failure: true # Issue #57
|
|
stdin: |
|
|
shopt -s expand_aliases
|
|
alias cmd='echo '
|
|
alias other='replaced '
|
|
alias otherother='also-replaced'
|
|
|
|
cmd other otherother
|
|
|
|
- name: "Alias referencing to alias"
|
|
known_failure: true # Issue #57
|
|
stdin: |
|
|
shopt -s expand_aliases
|
|
alias myalias=echo
|
|
alias outeralias=myalias
|
|
outeralias 'hello'
|
|
|
|
- name: "Alias to keywords"
|
|
known_failure: true # Issue #286
|
|
stdin: |
|
|
shopt -s expand_aliases
|
|
alias myalias=if
|
|
myalias true; then echo "true"; fi
|
|
|
|
- name: "alias display quotes values"
|
|
stdin: |
|
|
alias q1="a'b"
|
|
alias q2="'"
|
|
alias q3="a''b"
|
|
alias q4='a "b" $c'
|
|
alias q5="$(printf 'a\tb')"
|
|
alias q6="a
|
|
b"
|
|
|
|
alias
|
|
alias -p
|
|
alias q1 q3
|
|
|
|
- name: "alias lists a definition without the alias prefix in POSIX mode"
|
|
known_failure: true # TODO(alias): brush prints `alias x=...` in POSIX mode, where bash prints `x=...`
|
|
stdin: |
|
|
set -o posix
|
|
alias x=y
|
|
alias x
|
|
alias -p
|
|
|
|
- name: "alias rejects a compound value"
|
|
known_failure: true # TODO(alias): brush defines the alias from the compound value; bash reports the name as not found
|
|
ignore_stderr: true
|
|
stdin: |
|
|
alias a=(1 2); echo "rc=$?"
|
|
alias a 2>/dev/null; echo "rc=$?"
|
|
|
|
- name: "alias and unalias take --"
|
|
stdin: |
|
|
alias -- a=b
|
|
alias a
|
|
unalias -- a
|
|
alias a 2>/dev/null; echo "rc=$?"
|
|
|
|
- name: "alias prints a name that starts with - after --"
|
|
known_failure: true # TODO(alias): prints `alias -a='b'`, without `--`
|
|
stdin: |
|
|
alias -- -a=b
|
|
alias -- -a
|
|
|
|
#
|
|
# An alias body is expanded before the resulting words are inspected, so an alias can supply
|
|
# the name of a declaration builtin and have the operands that follow it still be treated as
|
|
# assignments rather than ordinary strings.
|
|
#
|
|
- name: "alias supplying a declaration builtin still splits its compound operand"
|
|
stdin: |
|
|
shopt -s expand_aliases
|
|
alias mydecl='declare -a'
|
|
v="a b"
|
|
mydecl arr=($v)
|
|
declare -p arr
|
|
|
|
- name: "alias supplying export assigns and exports"
|
|
stdin: |
|
|
shopt -s expand_aliases
|
|
alias exp='export'
|
|
exp E1=val
|
|
echo "E1=$E1"
|
|
declare -p E1
|