Compare commits
No commits in common. "7f7c386439265cca9d9f121cdf34fd87845548a4" and "43f68fefd32aa1843ca9dde6e8dedab87dcbe275" have entirely different histories.
7f7c386439
...
43f68fefd3
2 changed files with 19 additions and 310 deletions
58
bash-abbr
58
bash-abbr
|
|
@ -150,11 +150,10 @@ _redir_or_assign_word () {
|
||||||
_double_quoted_string='\$?"([^"]|\\")*"' \
|
_double_quoted_string='\$?"([^"]|\\")*"' \
|
||||||
_single_quoted_string="\\\$?'[^']*'" \
|
_single_quoted_string="\\\$?'[^']*'" \
|
||||||
_backtick_string='`([^`]|\\`)*`' \
|
_backtick_string='`([^`]|\\`)*`' \
|
||||||
_simple_variable='\$([[:alpha:]_][[:alnum:]]*|[-_$!*#[:digit:]])' \
|
_simple_variable='\$[[:alpha:]_][[:alnum:]]*' \
|
||||||
_advanced_variable='\$\{([[:alpha:]_][[:alnum:]]*|[-_$!*#[:digit:]])[^}]*\}' \
|
_advanced_variable='\$\{([[:alnum:]]+|[#-_$!*#])[^{}]*\}' \
|
||||||
_deprecated_arithmetic_eval='\$\[[^][]*\]' \
|
_deprecated_arithmetic_eval='\$\[[^][]*\]' \
|
||||||
_cmd_subst='\$\([^()]*\)' \
|
_cmd_subst_or_arithmetic_eval='\$\([^()]*\)' \
|
||||||
_arithmetic_eval='\$\(\([^()]*\)\)' \
|
|
||||||
_process_substition='<\([^()]*\)' \
|
_process_substition='<\([^()]*\)' \
|
||||||
_escaped_char='\\.'
|
_escaped_char='\\.'
|
||||||
declare _part="$_simple_unquoted_word"
|
declare _part="$_simple_unquoted_word"
|
||||||
|
|
@ -164,11 +163,10 @@ _redir_or_assign_word () {
|
||||||
_part+="|$_simple_variable"
|
_part+="|$_simple_variable"
|
||||||
_part+="|$_advanced_variable"
|
_part+="|$_advanced_variable"
|
||||||
_part+="|$_deprecated_arithmetic_eval"
|
_part+="|$_deprecated_arithmetic_eval"
|
||||||
_part+="|$_cmd_subst"
|
_part+="|$_cmd_subst_or_arithmetic_eval"
|
||||||
_part+="|$_arithmetic_eval"
|
|
||||||
_part+="|$_process_substition"
|
_part+="|$_process_substition"
|
||||||
_part+="|$_escaped_char"
|
_part+="|$_escaped_char"
|
||||||
declare -r _word="($_part)*" \
|
declare -r _word="($_part)+" \
|
||||||
_close_redirection="($_varredir_or_number)($_redir_in_or_out)($_close_or_move_fd)" \
|
_close_redirection="($_varredir_or_number)($_redir_in_or_out)($_close_or_move_fd)" \
|
||||||
_generic_redirection="($_redir_or_append_out_and_err|($_varredir_or_number)($_heredoc_herestring_in_out_etc))"
|
_generic_redirection="($_redir_or_append_out_and_err|($_varredir_or_number)($_heredoc_herestring_in_out_etc))"
|
||||||
# shellcheck disable=SC1087
|
# shellcheck disable=SC1087
|
||||||
|
|
@ -177,17 +175,17 @@ _redir_or_assign_word () {
|
||||||
unset -f _redir_or_assign_word
|
unset -f _redir_or_assign_word
|
||||||
}
|
}
|
||||||
# shellcheck disable=SC2155
|
# shellcheck disable=SC2155
|
||||||
declare _redir_or_assign_word="$(_redir_or_assign_word)" # TODO use bash 5.3 `${}` command substitution syntax to avoid subshells
|
declare -r _redir_or_assign_word="$(_redir_or_assign_word)" # TODO use bash 5.3 `${}` command substitution syntax to avoid subshells
|
||||||
|
|
||||||
declare -gr is_first_word_prefix="($_control_op)[[:blank:]]*((($_redir_or_assign_word)[[:blank:]]+)*)"
|
declare -r is_first_word_prefix="($_control_op)[[:blank:]]*((($_redir_or_assign_word)[[:blank:]])*)"
|
||||||
# If the regex leads to problems/performance issues, you may try this simpler regex
|
# If the regex leads to problems/performance issues, you may try this simpler regex
|
||||||
# that does no redirection/assignment word checking:
|
# that does no redirection/assignment word checking:
|
||||||
# declare -r is_first_word_prefix="($_control_op)[[:blank:]]*"
|
# declare -r is_first_word_prefix="($_control_op)[[:blank:]]*"
|
||||||
|
|
||||||
unset -v _control_op _redir_or_assign_word
|
unset -v _control_op
|
||||||
|
|
||||||
_try_abbrev_internal () {
|
_try_abbrev_internal () {
|
||||||
# Recursively perform interactive alias expansion on the line defined by $1, taking $2 as the point and $3 as the mark.
|
# Recursively perform abbrevation on the line defined by $1, taking $2 as the point and $3 as the mark.
|
||||||
# Set the vars defined by $4, $5 and $6 to the updated values (line, point and mark).
|
# Set the vars defined by $4, $5 and $6 to the updated values (line, point and mark).
|
||||||
# $7 is the character/string to self-insert.
|
# $7 is the character/string to self-insert.
|
||||||
declare -r line=$1 mark=$3 new_line=$4 new_point=$5 new_mark=$6 \
|
declare -r line=$1 mark=$3 new_line=$4 new_point=$5 new_mark=$6 \
|
||||||
|
|
@ -212,18 +210,11 @@ _try_abbrev_internal () {
|
||||||
declare -r point line_until_point=${line::point}
|
declare -r point line_until_point=${line::point}
|
||||||
|
|
||||||
if
|
if
|
||||||
# Check if the self-insertion character is a shell metacharacter, except tab and newline (we don't want
|
|
||||||
# interactive alias expansion on tab and newline is represented as the empty self-insertion character)
|
|
||||||
case "$self_insertion" in
|
|
||||||
(["${_bash_meta_chars_without_tab_and_nl[*]}"]|'') ;;
|
|
||||||
(*) false
|
|
||||||
esac &&
|
|
||||||
|
|
||||||
# Check if the character at point is a shell metacharacter or EOL
|
# Check if the character at point is a shell metacharacter or EOL
|
||||||
# [[ $point -eq ${#line} || "${line:point:1}" = ["${_bash_meta_chars[*]}"] ]] &&
|
# [[ $point -eq ${#line} || "${line:point:1}" = ["${_bash_meta_chars[*]}"] ]] &&
|
||||||
# NOTE: Above line commented out, it's actually not that useful.
|
# NOTE: Above line commented out, it's actually not that useful.
|
||||||
|
|
||||||
# Determine word to complete by stripping leading shell metacharacters
|
# Determine word to complete
|
||||||
# Uses the same word separators as bash (| & ; ( ) space tab newline) (aka "shell metacharacters")
|
# Uses the same word separators as bash (| & ; ( ) space tab newline) (aka "shell metacharacters")
|
||||||
# But < and > are ignored, since they always expect a file/delimiter/string afterwards and not a command
|
# But < and > are ignored, since they always expect a file/delimiter/string afterwards and not a command
|
||||||
declare -r word_at_point=${line_until_point##*["${_bash_meta_chars_without_left_right_angle_brackets[*]}"]} &&
|
declare -r word_at_point=${line_until_point##*["${_bash_meta_chars_without_left_right_angle_brackets[*]}"]} &&
|
||||||
|
|
@ -306,19 +297,16 @@ _try_abbrev_internal () {
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# Advance mark if it's set and right of (or on) the point.
|
# Advance mark if it's set and right of (or on) the point.
|
||||||
[[ $mark && mark -gt point ]] && eval "$new_mark"'=$((mark+offset))'
|
[[ $mark && mark -ge point ]] && eval "$new_mark"'=$((mark+offset))'
|
||||||
[[ -v "$new_mark" ]] || eval "$new_mark"'=$mark'
|
|
||||||
|
|
||||||
# Advance point.
|
# Advance point.
|
||||||
eval "$new_point"'=$((point+offset))'
|
eval "$new_point"'=$((point+offset))'
|
||||||
# NB: READLINE_ARGUMENT is deliberately ignored, as it doesn't make sense for interactive alias expansion.
|
# NB: READLINE_ARGUMENT is deliberately ignored.
|
||||||
}
|
}
|
||||||
|
|
||||||
_try_abbrev () {
|
_try_abbrev () {
|
||||||
# For use within bash's bind -x builtin.
|
# For use within bind -x.
|
||||||
# Perform interactive alias expansion on the word left to the cursor (no quote parsing) and also *on* the cursor if the
|
# Perform abbreviation lookup and interactive expansion on the word left to the cursor (no quote parsing).
|
||||||
# self-insertion character is empty (which represents pressing enter).
|
# Takes a single argument which is the character to self-insert (usually space or another shell metacharacter).
|
||||||
# Takes a single argument which is the character to self-insert (usually space or another shell metacharacter, or empty for newline/enter).
|
|
||||||
|
|
||||||
# To prevent infinite recursion, we need to keep track
|
# To prevent infinite recursion, we need to keep track
|
||||||
# of which aliases have been expanded. This function re-initializes the global associative array (used as a hash set)
|
# of which aliases have been expanded. This function re-initializes the global associative array (used as a hash set)
|
||||||
|
|
@ -353,18 +341,10 @@ bash_abbr () {
|
||||||
# called as many times as possible before recursion would happen.
|
# called as many times as possible before recursion would happen.
|
||||||
# This is pretty hard, and surely even harder to do efficiently,
|
# This is pretty hard, and surely even harder to do efficiently,
|
||||||
# so it will probably never be implemented.
|
# so it will probably never be implemented.
|
||||||
bind_if -x '"\e\C-an": _try_abbrev ""'
|
bind -x '"\e\C-an": _try_abbrev ""'
|
||||||
bind_if '"\e\C-j": accept-line'
|
bind '"\e\C-j": accept-line'
|
||||||
bind_if '"\C-m": "\e\C-an\e^\e\C-j"'
|
bind '"\C-m": "\e\C-an\e^\e\C-j"'
|
||||||
bind_if '"\C-j": "\C-m"'
|
bind '"\C-j": "\C-m"'
|
||||||
}
|
|
||||||
|
|
||||||
has_line_editing () {
|
|
||||||
shopt -qo emacs || shopt -qo vi
|
|
||||||
}
|
|
||||||
|
|
||||||
bind_if () {
|
|
||||||
has_line_editing && builtin bind "$@" || true
|
|
||||||
}
|
}
|
||||||
|
|
||||||
bash_abbr
|
bash_abbr
|
||||||
|
|
|
||||||
271
tests
271
tests
|
|
@ -1,271 +0,0 @@
|
||||||
#!/usr/bin/env bash
|
|
||||||
|
|
||||||
printf_if_clr () {
|
|
||||||
[[ -v NO_COLOR ]] && return
|
|
||||||
[[ -v FORCE_COLOR ]] || [[ -v CLIFORCE_COLOR ]] && { printf "$@"; return; }
|
|
||||||
[[ -v CLICOLOR ]] || [[ -v TERM ]] && [[ -t 1 ]] && { printf "$@"; return; }
|
|
||||||
|
|
||||||
# Fallback behavior
|
|
||||||
[[ -t 1 ]] && printf "$@"
|
|
||||||
|
|
||||||
}
|
|
||||||
log () {
|
|
||||||
clr=$1
|
|
||||||
shift
|
|
||||||
case "$clr" in
|
|
||||||
(white) printf_if_clr '\033[97m' ;;
|
|
||||||
(grey) printf_if_clr '\033[90m' ;;
|
|
||||||
(green) printf_if_clr '\033[92m' ;;
|
|
||||||
(red) printf_if_clr '\033[91m' ;;
|
|
||||||
(*) printf_if_clr '\033[m'
|
|
||||||
esac
|
|
||||||
printf "$@"
|
|
||||||
printf_if_clr '\033[m'
|
|
||||||
}
|
|
||||||
white () { log white "$@"; }
|
|
||||||
grey () { log grey "$@"; }
|
|
||||||
green () { log green "$@"; }
|
|
||||||
red () { log red "$@"; }
|
|
||||||
|
|
||||||
init () {
|
|
||||||
white '## Unit tests for bash-abbr ##\n'
|
|
||||||
white '# Running on bash version %s system type %s\n' "${BASH_VERSION@Q}" "${MACHTYPE@Q}"
|
|
||||||
. bash-abbr || { red 'Failed to source bash-abbr\n'; exit 1; }
|
|
||||||
unalias -a
|
|
||||||
declare -gi tests_passed=0 tests_failed=0 tests_total=0
|
|
||||||
[[ $1 ]] && declare -gi isolate_test=$1 || declare -gi isolate_test=0
|
|
||||||
}
|
|
||||||
|
|
||||||
# inherits all variables from test_abbr function
|
|
||||||
check () {
|
|
||||||
[[ ! $new_test_line = "$expected_line" ]] && { red 'Test %s "%s" failed: Line %s did not expand to expected line %s, but %s\n' "$tests_total" "$test_name" "${test_line@Q}" "${expected_line@Q}" "${new_test_line@Q}"; return 1; }
|
|
||||||
[[ ! $new_test_point = "$expected_point" ]] && { red 'Test %s "%s" failed: Point was %s and did not update to %s, but %s\n' "$tests_total" "$test_name" "${test_point@Q}" "${expected_point@Q}" "${new_test_point@Q}"; return 2; }
|
|
||||||
[[ ! $new_test_mark = "$expected_mark" ]] && { red 'Test %s "%s" failed: Mark was %s and did not update to %s, but %s\n' "$tests_total" "$test_name" "${test_mark@Q}" "${expected_mark@Q}" "${new_test_mark@Q}"; return 3; }
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
test_abbr () {
|
|
||||||
tests_total+=1
|
|
||||||
[[ isolate_test -gt 0 && isolate_test -ne tests_total ]] && return
|
|
||||||
|
|
||||||
declare test_name=$1
|
|
||||||
declare test_line=$2 new_test_line
|
|
||||||
declare test_point=$3 new_test_point
|
|
||||||
declare test_mark=$4 new_test_mark
|
|
||||||
declare expected_line=$5
|
|
||||||
declare expected_point=$6
|
|
||||||
declare expected_mark=$7
|
|
||||||
declare insertion_char=$8
|
|
||||||
shift 8
|
|
||||||
|
|
||||||
unalias -a
|
|
||||||
alias "$@"
|
|
||||||
|
|
||||||
declare -gA _expanded_aliases=()
|
|
||||||
_try_abbrev_internal "$test_line" "$test_point" "$test_mark" new_test_line new_test_point new_test_mark "$insertion_char"
|
|
||||||
unset -v _expanded_aliases
|
|
||||||
|
|
||||||
check && tests_passed+=1 || tests_failed+=1
|
|
||||||
}
|
|
||||||
|
|
||||||
summary () {
|
|
||||||
white 'Total number of tests: %q\n' "$tests_total"
|
|
||||||
grey 'Tests skipped: %q\n' "$((tests_total - tests_passed - tests_failed))"
|
|
||||||
green 'Tests passed: %q\n' "$tests_passed"
|
|
||||||
red 'Tests failed: %q\n' "$tests_failed"
|
|
||||||
}
|
|
||||||
|
|
||||||
init "$@"
|
|
||||||
|
|
||||||
# empty insertion char means a newline (or a similar accept-line command) was used
|
|
||||||
|
|
||||||
test_abbr "expand regular alias when followed by a space at EOL" 'foo' '3' '0' 'barr ' '5' '0' ' ' 'foo=barr'
|
|
||||||
test_abbr "expand regular alias when followed by a tab at EOL" 'foo' '3' '0' 'barr ' '5' '0' ' ' 'foo=barr'
|
|
||||||
test_abbr "expand regular alias when followed by a newline at EOL" 'foo' '3' '0' 'barr' '4' '0' '' 'foo=barr'
|
|
||||||
test_abbr "expand regular alias when followed by a ')' at EOL" 'foo' '3' '0' 'barr ' '5' '0' ' ' 'foo=barr'
|
|
||||||
test_abbr "expand regular alias when followed by a '(' at EOL" 'foo' '3' '0' 'barr ' '5' '0' ' ' 'foo=barr'
|
|
||||||
test_abbr "expand regular alias when followed by a '<' at EOL" 'foo' '3' '0' 'barr ' '5' '0' ' ' 'foo=barr'
|
|
||||||
test_abbr "expand regular alias when followed by a '>' at EOL" 'foo' '3' '0' 'barr ' '5' '0' ' ' 'foo=barr'
|
|
||||||
test_abbr "expand regular alias when followed by a '&' at EOL" 'foo' '3' '0' 'barr ' '5' '0' ' ' 'foo=barr'
|
|
||||||
test_abbr "expand regular alias when followed by a ';' at EOL" 'foo' '3' '0' 'barr ' '5' '0' ' ' 'foo=barr'
|
|
||||||
|
|
||||||
test_abbr "don't expand regular alias when followed by a ']' at EOL" 'foo' '3' '0' 'foo]' '4' '0' ']' 'foo=barr'
|
|
||||||
test_abbr "don't expand regular alias when followed by a '[' at EOL" 'foo' '3' '0' 'foo[' '4' '0' '[' 'foo=barr'
|
|
||||||
test_abbr "don't expand regular alias when followed by a '}' at EOL" 'foo' '3' '0' 'foo}' '4' '0' '}' 'foo=barr'
|
|
||||||
test_abbr "don't expand regular alias when followed by a '.' at EOL" 'foo' '3' '0' 'foo.' '4' '0' '.' 'foo=barr'
|
|
||||||
test_abbr "don't expand regular alias when followed by a 'b' at EOL" 'foo' '3' '0' 'foob' '4' '0' 'b' 'foo=barr'
|
|
||||||
|
|
||||||
test_abbr "expand regular alias when followed by a space inside word" 'foobar' '3' '0' 'barr bar' '5' '0' ' ' 'foo=barr'
|
|
||||||
test_abbr "expand regular alias when followed by a tab inside word" 'foobar' '3' '0' 'barr bar' '5' '0' ' ' 'foo=barr'
|
|
||||||
test_abbr "expand regular alias when followed by a ) inside word" 'foobar' '3' '0' 'barr bar' '5' '0' ' ' 'foo=barr'
|
|
||||||
test_abbr "expand regular alias when followed by a ( inside word" 'foobar' '3' '0' 'barr bar' '5' '0' ' ' 'foo=barr'
|
|
||||||
test_abbr "expand regular alias when followed by a < inside word" 'foobar' '3' '0' 'barr bar' '5' '0' ' ' 'foo=barr'
|
|
||||||
test_abbr "expand regular alias when followed by a > inside word" 'foobar' '3' '0' 'barr bar' '5' '0' ' ' 'foo=barr'
|
|
||||||
test_abbr "expand regular alias when followed by a & inside word" 'foobar' '3' '0' 'barr bar' '5' '0' ' ' 'foo=barr'
|
|
||||||
test_abbr "expand regular alias when followed by a ; inside word" 'foobar' '3' '0' 'barr bar' '5' '0' ' ' 'foo=barr'
|
|
||||||
|
|
||||||
test_abbr "don't expand regular alias when followed by a newline inside word" 'foobar' '3' '0' 'foobar' '6' '0' '' 'foo=barr'
|
|
||||||
|
|
||||||
test_abbr "don't expand regular alias when space is entered at the beginning" 'foo' '0' '0' ' foo' '1' '0' ' ' 'foo=barr'
|
|
||||||
test_abbr "don't expand regular alias when space is entered after 1st character inside alias" 'foo' '1' '0' 'f oo' '2' '0' ' ' 'foo=barr'
|
|
||||||
test_abbr "don't expand regular alias when space is entered before last character inside alias" 'foo' '2' '0' 'fo o' '3' '0' ' ' 'foo=barr'
|
|
||||||
|
|
||||||
test_abbr "expand regular alias when newline is entered at the beginning" 'foo' '0' '0' 'barr' '4' '0' '' 'foo=barr'
|
|
||||||
test_abbr "expand regular alias when newline is entered after 1st character inside alias" 'foo' '1' '0' 'barr' '4' '0' '' 'foo=barr'
|
|
||||||
test_abbr "expand regular alias when newline is entered before last character inside alias" 'foo' '2' '0' 'barr' '4' '0' '' 'foo=barr'
|
|
||||||
|
|
||||||
test_abbr "recursively expand regular alias once" 'foo' '3' '0' 'bazqux ' '7' '0' ' ' 'foo=bar' 'bar=bazqux'
|
|
||||||
test_abbr "recursively expand regular alias twice" 'foo' '3' '0' 'wowitworks ' '11' '0' ' ' 'foo=bar' 'bar=bazqux' 'bazqux=wowitworks'
|
|
||||||
test_abbr "recursively expand regular alias thrice with a shorter final alias" 'foo' '3' '0' 'shorter ' '8' '0' ' ' 'foo=bar' 'bar=bazqux' 'bazqux=wowitworks' 'wowitworks=shorter'
|
|
||||||
|
|
||||||
test_abbr "don't recursively expand regular alias infinitely (0 indirections)" 'foo' '3' '0' 'foo ' '4' '0' ' ' 'foo=foo'
|
|
||||||
test_abbr "don't recursively expand regular alias infinitely (1 indirection)" 'foo' '3' '0' 'foo ' '4' '0' ' ' 'foo=bar' 'bar=foo'
|
|
||||||
test_abbr "don't recursively expand regular alias infinitely (2 indirections)" 'foo' '3' '0' 'foo ' '4' '0' ' ' 'foo=bar' 'bar=baz' 'baz=foo'
|
|
||||||
test_abbr "don't recursively expand regular alias infinitely (3 indirections)" 'foo' '3' '0' 'foo ' '4' '0' ' ' 'foo=bar' 'bar=baz' 'baz=qux' 'qux=foo'
|
|
||||||
|
|
||||||
test_abbr "don't recursively expand regular alias infinitely (1 indirection, different lengths)" 'foo' '3' '0' 'foo ' '4' '0' ' ' 'foo=b' 'b=foo'
|
|
||||||
test_abbr "don't recursively expand regular alias infinitely (2 indirections, different lengths)" 'foo' '3' '0' 'foo ' '4' '0' ' ' 'foo=ba' 'ba=bazz' 'bazz=foo'
|
|
||||||
test_abbr "don't recursively expand regular alias infinitely (3 indirections, different lengths)" 'foo' '3' '0' 'foo ' '4' '0' ' ' 'foo=barst' 'barst=b' 'b=quxio' 'quxio=foo'
|
|
||||||
|
|
||||||
# Note that there are two spaces after the `foo=` because a single spaces is used as an escape mechanism for different alias flags like * or $. See later test cases.
|
|
||||||
test_abbr "recursively expand regular alias when alias value has leading spaces before the first command word" 'foo' '3' '0' ' cool ' '7' '0' ' ' 'foo= bar' 'bar=cool'
|
|
||||||
test_abbr "recursively expand regular alias when alias value has leading tabs before the first command word" 'foo' '3' '0' $'\t\tcool ' '7' '0' ' ' $'foo=\t\tbar' 'bar=cool'
|
|
||||||
test_abbr "recursively expand regular alias when alias value has leading spaces and assignment words before the first command word" 'foo' '3' '0' ' a=1 b=2 cool ' '14' '0' ' ' 'foo= a=1 b=2 bar' 'bar=cool'
|
|
||||||
test_abbr "recursively expand regular alias when alias value has leading spaces and redirections before the first command word" 'foo' '3' '0' ' 3>/dev/null 2>&1- cool ' '24' '0' ' ' 'foo= 3>/dev/null 2>&1- bar' 'bar=cool'
|
|
||||||
|
|
||||||
test_abbr "recursively expand regular alias when entering a newline mid-word" 'foo' '2' '0' 'cool' '4' '0' '' 'foo=bar' 'bar=cool'
|
|
||||||
|
|
||||||
test_abbr "don't expand regular alias when value is empty" 'foo' '3' '0' 'foo ' '4' '0' ' ' 'foo='
|
|
||||||
|
|
||||||
test_abbr "expand regular alias when it has a leading assignment word with spaces" 'A=1 foo' '7' '0' 'A=1 barr ' '9' '0' ' ' 'foo=barr'
|
|
||||||
test_abbr "expand regular alias when it has leading assignment words with spaces" 'A=1 B=2 C=3 foo' '20' '0' 'A=1 B=2 C=3 barr ' '22' '0' ' ' 'foo=barr'
|
|
||||||
test_abbr "expand regular alias when it has leading assignment words with spaces and tabs" $'A=1 \t B=2\t C=3\tfoo' '19' '0' $'A=1 \t B=2\t C=3\tbarr ' '21' '0' ' ' 'foo=barr'
|
|
||||||
test_abbr "expand regular alias when it has a leading null assignment word" 'A= foo' '6' '0' 'A= barr ' '8' '0' ' ' 'foo=barr'
|
|
||||||
test_abbr "expand regular alias when it has two leading null assignment words" 'A= B= foo' '9' '0' 'A= B= barr ' '11' '0' ' ' 'foo=barr'
|
|
||||||
|
|
||||||
test_abbr "expand regular alias when it has a leading single-quoted assignment word without spaces" "A='whatever' foo" '16' '0' "A='whatever' barr " '18' '0' ' ' 'foo=barr'
|
|
||||||
test_abbr "expand regular alias when it has a leading single-quoted assignment word with spaces" "A='what ever' foo" '17' '0' "A='what ever' barr " '19' '0' ' ' 'foo=barr'
|
|
||||||
test_abbr "expand regular alias when it has a leading dollar single-quoted assignment word with spaces" "A=$'what ever' foo" '18' '0' "A=$'what ever' barr " '20' '0' ' ' 'foo=barr'
|
|
||||||
|
|
||||||
test_abbr "expand regular alias when it has a leading double-quoted assignment word without spaces" 'A="whatever" foo' '16' '0' 'A="whatever" barr ' '18' '0' ' ' 'foo=barr'
|
|
||||||
test_abbr "expand regular alias when it has a leading double-quoted assignment word with spaces" 'A="what ever" foo' '17' '0' 'A="what ever" barr ' '19' '0' ' ' 'foo=barr'
|
|
||||||
test_abbr "expand regular alias when it has a leading double-quoted assignment word with spaces and an escaped double quote" 'A="what \"ever" foo' '19' '0' 'A="what \"ever" barr ' '21' '0' ' ' 'foo=barr'
|
|
||||||
test_abbr "expand regular alias when it has a leading dollar double-quoted assignment word with spaces" 'A=$"what ever" foo' '18' '0' 'A=$"what ever" barr ' '20' '0' ' ' 'foo=barr'
|
|
||||||
|
|
||||||
test_abbr "expand regular alias when it has a leading assignment word with backtick command substitution with spaces" 'A=`what ever` foo' '17' '0' 'A=`what ever` barr ' '19' '0' ' ' 'foo=barr'
|
|
||||||
test_abbr "expand regular alias when it has a leading assignment word with normal command substitution with spaces" 'A=$(echo hi; arbitrary commands; no nesting allowed!; literally anyhing '\'' " > @ [ ] { } ;) foo' '97' '0' 'A=$(echo hi; arbitrary commands; no nesting allowed!; literally anyhing '\'' " > @ [ ] { } ;) barr ' '99' '0' ' ' 'foo=barr'
|
|
||||||
test_abbr "expand regular alias when it has a leading assignment word with deprecated arithmetic expansion with spaces" 'A=$[1 + 1, 2 ** 4#2] foo' '24' '0' 'A=$[1 + 1, 2 ** 4#2] barr ' '26' '0' ' ' 'foo=barr'
|
|
||||||
test_abbr "expand regular alias when it has a leading assignment word with normal arithmetic expansion with spaces" 'A=$((1 + 1, 2 ** 4#2)) foo' '26' '0' 'A=$((1 + 1, 2 ** 4#2)) barr ' '28' '0' ' ' 'foo=barr'
|
|
||||||
test_abbr "expand regular alias when it has a leading assignment word with simple variable expansion" 'A=$FOO foo' '10' '0' 'A=$FOO barr ' '12' '0' ' ' 'foo=barr'
|
|
||||||
test_abbr "expand regular alias when it has a leading assignment word with special variable expansion" 'A=$- foo' '8' '0' 'A=$- barr ' '10' '0' ' ' 'foo=barr'
|
|
||||||
test_abbr "expand regular alias when it has a leading assignment word with simple braced variable expansion" 'A=${FOO} foo' '12' '0' 'A=${FOO} barr ' '14' '0' ' ' 'foo=barr'
|
|
||||||
test_abbr "expand regular alias when it has a leading assignment word with special braced variable expansion" 'A=${-} foo' '12' '0' 'A=${-} barr ' '14' '0' ' ' 'foo=barr'
|
|
||||||
test_abbr "expand regular alias when it has a leading assignment word with advanced braced variable expansion" 'A=${FOO: -1:2} foo' '18' '0' 'A=${FOO: -1:2} barr ' '20' '0' ' ' 'foo=barr'
|
|
||||||
test_abbr "expand regular alias when it has a leading assignment word with advanced special braced variable expansion" 'A=${-: -1:2} foo' '16' '0' 'A=${-: -1:2} barr ' '18' '0' ' ' 'foo=barr'
|
|
||||||
test_abbr "expand regular alias when it has a leading assignment word with process substitution with spaces" 'A=<(echo bla) foo' '17' '0' 'A=<(echo bla) barr ' '19' '0' ' ' 'foo=barr'
|
|
||||||
test_abbr "expand regular alias when it has a leading backslash quoted assignment word with spaces" 'A=what\ ever foo' '16' '0' 'A=what\ ever barr ' '18' '0' ' ' 'foo=barr'
|
|
||||||
|
|
||||||
test_abbr "expand regular alias when it has multiple leading complex assignment words separated by multiple spaces or tabs" \
|
|
||||||
$'_A= B=2 \t \t C=<(echo bla; whatever)test$(bla bla bla)` hey`\'quoted string\'"another \\"one\\""$(( 1+1 ))$[ 2**2 ]$\'and another one\'$"translated \\"string"\\.\\ \\c\\o\\o\\l$foo${bar}${baz%%hey}$-$1${10}\tD=cool foo' '207' '0' \
|
|
||||||
$'_A= B=2 \t \t C=<(echo bla; whatever)test$(bla bla bla)` hey`\'quoted string\'"another \\"one\\""$(( 1+1 ))$[ 2**2 ]$\'and another one\'$"translated \\"string"\\.\\ \\c\\o\\o\\l$foo${bar}${baz%%hey}$-$1${10}\tD=cool barr ' '209' '0' \
|
|
||||||
' ' 'foo=barr'
|
|
||||||
|
|
||||||
test_abbr "don't expand regular alias when there's an invalid assignment word (0what=1)" '0what=1 foo' '11' '0' '0what=1 foo ' '12' '0' ' ' 'foo=barr'
|
|
||||||
test_abbr "don't expand regular alias when there's an invalid assignment word (what=\$[[hey]])" 'what=$[[hey]] foo' '17' '0' 'what=$[[hey]] foo ' '18' '0' ' ' 'foo=barr'
|
|
||||||
|
|
||||||
test_abbr "expand regular alias when it has a leading output redirection" '>/dev/null foo' '14' '0' '>/dev/null barr ' '16' '0' ' ' 'foo=barr'
|
|
||||||
test_abbr "expand regular alias when it has a leading output redirection with tabs and spaces" $'> \t /dev/null foo' '17' '0' $'> \t /dev/null barr ' '19' '0' ' ' 'foo=barr'
|
|
||||||
test_abbr "expand regular alias when it has a leading input redirection" '<hey foo' '8' '0' '<hey barr ' '10' '0' ' ' 'foo=barr'
|
|
||||||
test_abbr "expand regular alias when it has a leading heredoc" '<<! foo' '7' '0' '<<! barr ' '9' '0' ' ' 'foo=barr'
|
|
||||||
test_abbr "expand regular alias when it has a leading indentation aware heredoc" '<<-cool foo' '11' '0' '<<-cool barr ' '13' '0' ' ' 'foo=barr'
|
|
||||||
test_abbr "expand regular alias when it has a leading indentation aware heredoc with tabs and spaces" $'<<- \t cool foo' '14' '0' $'<<- \t cool barr ' '16' '0' ' ' 'foo=barr'
|
|
||||||
test_abbr "expand regular alias when it has a leading herestring" '<<<"hey" foo' '12' '0' '<<<"hey" barr ' '14' '0' ' ' 'foo=barr'
|
|
||||||
test_abbr "expand regular alias when it has a leading append redirection" '>>hey foo' '9' '0' '>>hey barr ' '11' '0' ' ' 'foo=barr'
|
|
||||||
test_abbr "expand regular alias when it has a leading noclobber output redirection" '>|hey foo' '9' '0' '>|hey barr ' '11' '0' ' ' 'foo=barr'
|
|
||||||
test_abbr "expand regular alias when it has a leading output redirection with fd" '5>hey foo' '9' '0' '5>hey barr ' '11' '0' ' ' 'foo=barr'
|
|
||||||
test_abbr "expand regular alias when it has a leading output redirection with a {varname}" '{bla}>hey foo' '13' '0' '{bla}>hey barr ' '15' '0' ' ' 'foo=barr'
|
|
||||||
test_abbr "expand regular alias when it has a leading read-write redirection" '<>file foo' '10' '0' '<>file barr ' '12' '0' ' ' 'foo=barr'
|
|
||||||
test_abbr "expand regular alias when it has a leading file descriptor close redirection" '>&- foo' '7' '0' '>&- barr ' '9' '0' ' ' 'foo=barr'
|
|
||||||
test_abbr "expand regular alias when it has a leading file descriptor move redirection" '>&5- foo' '8' '0' '>&5- barr ' '10' '0' ' ' 'foo=barr'
|
|
||||||
test_abbr "expand regular alias when it has a leading file descriptor move redirection with fd" '6>&5- foo' '9' '0' '6>&5- barr ' '11' '0' ' ' 'foo=barr'
|
|
||||||
|
|
||||||
test_abbr "expand regular alias when it has multiple leading redirections" '>/dev/null 2>&1 2>/dev/null 3<>file 3>&4- foo' '45' '0' '>/dev/null 2>&1 2>/dev/null 3<>file 3>&4- barr ' '47' '0' ' ' 'foo=barr'
|
|
||||||
|
|
||||||
test_abbr "expand regular alias when it has multiple leading complex redirections separated by multiple spaces or tabs" \
|
|
||||||
$'<<! 2<<<"str" {BASH_XTRACEFD}>|../log <x >&- 3<&- 4>&1- >/dev/null 2>&3 \t \t 5<><(echo bla; whatever)test$(bla bla bla)` hey`\'quoted string\'"another \\"one\\""$(( 1+1 ))$[ 2**2 ]$\'and another one\'$"translated \\"string"\\.\\ \\c\\o\\o\\l$foo${bar}${baz%%hey}$-$1${10}\t<<<cool foo' '273' '0' \
|
|
||||||
$'<<! 2<<<"str" {BASH_XTRACEFD}>|../log <x >&- 3<&- 4>&1- >/dev/null 2>&3 \t \t 5<><(echo bla; whatever)test$(bla bla bla)` hey`\'quoted string\'"another \\"one\\""$(( 1+1 ))$[ 2**2 ]$\'and another one\'$"translated \\"string"\\.\\ \\c\\o\\o\\l$foo${bar}${baz%%hey}$-$1${10}\t<<<cool barr ' '275' '0' \
|
|
||||||
' ' 'foo=barr'
|
|
||||||
|
|
||||||
test_abbr "expand regular alias when it has multiple leading assignment words and redirections" \
|
|
||||||
$' >/dev/null A=1 1>&3- <>file \t _B=$(hello world)"cool"$VAR << <(test) foo' '74' '0' \
|
|
||||||
$' >/dev/null A=1 1>&3- <>file \t _B=$(hello world)"cool"$VAR << <(test) barr ' '76' '0' \
|
|
||||||
' ' 'foo=barr'
|
|
||||||
|
|
||||||
test_abbr "don't expand regular alias when there's an invalid redirection operator (6<>&5-)" '6<>&5- foo' '10' '0' '6<>&5- foo ' '11' '0' ' ' 'foo=barr'
|
|
||||||
test_abbr "don't expand regular alias when there's an invalid redirection operator (>>>)" '>>> foo' '7' '0' '>>> foo ' '8' '0' ' ' 'foo=barr'
|
|
||||||
test_abbr "don't expand regular alias when there's an invalid redirection operator ({0fail}>file)" '{0fail}>file foo' '16' '0' '{0fail}>file foo ' '17' '0' ' ' 'foo=barr'
|
|
||||||
|
|
||||||
test_abbr "expand regular alias when it has one leading control operator (&&)" ' && foo' '7' '0' ' && barr ' '9' '0' ' ' 'foo=barr'
|
|
||||||
test_abbr "expand regular alias when it has one leading control operator (||)" ' || foo' '7' '0' ' || barr ' '9' '0' ' ' 'foo=barr'
|
|
||||||
test_abbr "expand regular alias when it has one leading control operator (|)" ' | foo' '6' '0' ' | barr ' '8' '0' ' ' 'foo=barr'
|
|
||||||
test_abbr "expand regular alias when it has one leading control operator (;)" ' ; foo' '6' '0' ' ; barr ' '8' '0' ' ' 'foo=barr'
|
|
||||||
test_abbr "expand regular alias when it has one leading control operator (;;)" ' ;; foo' '7' '0' ' ;; barr ' '9' '0' ' ' 'foo=barr'
|
|
||||||
test_abbr "expand regular alias when it has one leading control operator (;&)" ' ;& foo' '7' '0' ' ;& barr ' '9' '0' ' ' 'foo=barr'
|
|
||||||
test_abbr "expand regular alias when it has one leading control operator (;;&)" ' ;;& foo' '8' '0' ' ;;& barr ' '10' '0' ' ' 'foo=barr'
|
|
||||||
test_abbr "expand regular alias when it has one leading control operator (&)" ' & foo' '6' '0' ' & barr ' '8' '0' ' ' 'foo=barr'
|
|
||||||
test_abbr "expand regular alias when it has one leading control operator (newline)" $'\nfoo' '4' '0' $'\nbarr ' '6' '0' ' ' 'foo=barr'
|
|
||||||
test_abbr "expand regular alias when it has one leading control operator (opening parenthesis)" '(foo' '4' '0' '(barr ' '6' '0' ' ' 'foo=barr'
|
|
||||||
|
|
||||||
test_abbr "don't expand regular alias when there's a closing parenthesis" ' ) foo' '7' '0' ' ) foo ' '8' '0' ' ' 'foo=barr'
|
|
||||||
|
|
||||||
test_abbr "expand regular alias when it has two leading control operators" ' && echo hi && foo' '18' '0' ' && echo hi && barr ' '20' '0' ' ' 'foo=barr'
|
|
||||||
test_abbr "expand regular alias when it has two leading and one trailing control operator(s)" ' && echo hi (foo&& okay)' '16' '0' ' && echo hi (barr && okay)' '18' '0' ' ' 'foo=barr'
|
|
||||||
|
|
||||||
test_abbr "expand regular alias when it has leading and trailing control operators, assignment words and redirections" $'\necho hi&&a=1 echo ho || 2>/dev/null echo bla & {var}<>file another ;;& a=1 2>/dev/null 3>&4- foo; >/dev/null cool <>file' '97' '0' $'\necho hi&&a=1 echo ho || 2>/dev/null echo bla & {var}<>file another ;;& a=1 2>/dev/null 3>&4- barr ; >/dev/null cool <>file' '99' '0' ' ' 'foo=barr'
|
|
||||||
|
|
||||||
test_abbr "don't expand regular alias when it's not the first word" 'hey foo' '7' '0' 'hey foo ' '8' '0' ' ' 'foo=barr'
|
|
||||||
|
|
||||||
test_abbr "don't expand regular alias when there's a double quoted ';' before it" 'echo ";" foo' '12' '0' 'echo ";" foo ' '13' '0' ' ' 'foo=barr'
|
|
||||||
test_abbr "don't expand regular alias when there is 1 backslash before a ';' before the alias" 'echo \; foo' '11' '0' 'echo \; foo ' '12' '0' ' ' 'foo=barr'
|
|
||||||
test_abbr "expand regular alias when there are 2 backslashes before a ';' before the alias" 'echo \\; foo' '12' '0' 'echo \\; barr ' '14' '0' ' ' 'foo=barr'
|
|
||||||
test_abbr "don't expand regular alias when there are 3 backslashes before a ';' before the alias" 'echo \\\; foo' '13' '0' 'echo \\\; foo ' '14' '0' ' ' 'foo=barr'
|
|
||||||
test_abbr "expand regular alias when there are 4 backslashes before a ';' before the alias" 'echo \\\\; foo' '14' '0' 'echo \\\\; barr ' '16' '0' ' ' 'foo=barr'
|
|
||||||
test_abbr "don't expand regular alias when there are 5 backslashes before a ';' before the alias" 'echo \\\\\; foo' '15' '0' 'echo \\\\\; foo ' '16' '0' ' ' 'foo=barr'
|
|
||||||
test_abbr "expand regular alias when there are 6 backslashes before a ';' before the alias" 'echo \\\\\\; foo' '16' '0' 'echo \\\\\\; barr ' '18' '0' ' ' 'foo=barr'
|
|
||||||
|
|
||||||
test_abbr "don't expand regular alias when there is 1 backslash before a & before the alias" 'echo \& foo' '11' '0' 'echo \& foo ' '12' '0' ' ' 'foo=barr'
|
|
||||||
test_abbr "expand regular alias when there are 2 backslashes before a & before the alias" 'echo \\& foo' '12' '0' 'echo \\& barr ' '14' '0' ' ' 'foo=barr'
|
|
||||||
test_abbr "don't expand regular alias when there are 3 backslashes before a & before the alias" 'echo \\\& foo' '13' '0' 'echo \\\& foo ' '14' '0' ' ' 'foo=barr'
|
|
||||||
|
|
||||||
test_abbr "don't expand regular alias when there is 1 backslash before a | before the alias" 'echo \| foo' '11' '0' 'echo \| foo ' '12' '0' ' ' 'foo=barr'
|
|
||||||
test_abbr "expand regular alias when there are 2 backslashes before a | before the alias" 'echo \\| foo' '12' '0' 'echo \\| barr ' '14' '0' ' ' 'foo=barr'
|
|
||||||
test_abbr "don't expand regular alias when there are 3 backslashes before a | before the alias" 'echo \\\| foo' '13' '0' 'echo \\\| foo ' '14' '0' ' ' 'foo=barr'
|
|
||||||
|
|
||||||
test_abbr "expand regular alias when there is 1 backslash before a ||" 'echo \|| foo' '12' '0' 'echo \|| barr ' '14' '0' ' ' 'foo=barr'
|
|
||||||
test_abbr "expand regular alias when there are 2 backslashes before a ||" 'echo \\|| foo' '13' '0' 'echo \\|| barr ' '15' '0' ' ' 'foo=barr'
|
|
||||||
test_abbr "expand regular alias when there are 3 backslashes before a ||" 'echo \\\|| foo' '14' '0' 'echo \\\|| barr ' '16' '0' ' ' 'foo=barr'
|
|
||||||
|
|
||||||
test_abbr "expand regular alias when there is 1 backslash before a &&" 'echo \&& foo' '12' '0' 'echo \&& barr ' '14' '0' ' ' 'foo=barr'
|
|
||||||
test_abbr "expand regular alias when there are 2 backslashes before a &&" 'echo \\&& foo' '13' '0' 'echo \\&& barr ' '15' '0' ' ' 'foo=barr'
|
|
||||||
test_abbr "expand regular alias when there are 3 backslashes before a &&" 'echo \\\&& foo' '14' '0' 'echo \\\&& barr ' '16' '0' ' ' 'foo=barr'
|
|
||||||
|
|
||||||
test_abbr "expand regular alias when there is 1 backslash before a ;;" 'echo \;; foo' '12' '0' 'echo \;; barr ' '14' '0' ' ' 'foo=barr'
|
|
||||||
test_abbr "expand regular alias when there are 2 backslashes before a ;;" 'echo \\;; foo' '13' '0' 'echo \\;; barr ' '15' '0' ' ' 'foo=barr'
|
|
||||||
test_abbr "expand regular alias when there are 3 backslashes before a ;;" 'echo \\\;; foo' '14' '0' 'echo \\\;; barr ' '16' '0' ' ' 'foo=barr'
|
|
||||||
|
|
||||||
test_abbr "expand regular alias when there is 1 backslash before a ;;&" 'echo \;;& foo' '13' '0' 'echo \;;& barr ' '15' '0' ' ' 'foo=barr'
|
|
||||||
test_abbr "expand regular alias when there are 2 backslashes before a ;;&" 'echo \\;;& foo' '14' '0' 'echo \\;;& barr ' '16' '0' ' ' 'foo=barr'
|
|
||||||
test_abbr "expand regular alias when there are 3 backslashes before a ;;&" 'echo \\\;;& foo' '15' '0' 'echo \\\;;& barr ' '17' '0' ' ' 'foo=barr'
|
|
||||||
|
|
||||||
test_abbr "expand regular alias when there is 1 backslash before a ;&" 'echo \;& foo' '12' '0' 'echo \;& barr ' '14' '0' ' ' 'foo=barr'
|
|
||||||
test_abbr "expand regular alias when there are 2 backslashes before a ;&" 'echo \\;& foo' '13' '0' 'echo \\;& barr ' '15' '0' ' ' 'foo=barr'
|
|
||||||
test_abbr "expand regular alias when there are 3 backslashes before a ;&" 'echo \\\;& foo' '14' '0' 'echo \\\;& barr ' '16' '0' ' ' 'foo=barr'
|
|
||||||
|
|
||||||
test_abbr "don't expand regular alias when there is 1 backslash before a (" 'echo \( foo' '11' '0' 'echo \( foo ' '12' '0' ' ' 'foo=barr'
|
|
||||||
test_abbr "expand regular alias when there are 2 backslashes before a (" 'echo \\( foo' '12' '0' 'echo \\( barr ' '14' '0' ' ' 'foo=barr'
|
|
||||||
test_abbr "expand regular alias when there are 3 backslashes before a (" 'echo \\\( foo' '13' '0' 'echo \\\( foo ' '14' '0' ' ' 'foo=barr'
|
|
||||||
|
|
||||||
test_abbr "don't expand regular alias when newline is entered not after or on the alias" 'foo ' '4' '0' 'foo ' '4' '0' '' 'foo=bar'
|
|
||||||
test_abbr "don't expand regular alias when space is entered not after or on the alias" 'foo ' '4' '0' 'foo ' '5' '0' ' ' 'foo=bar'
|
|
||||||
|
|
||||||
summary
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue