$+functions[_expand-aliases]
равно 1, если ассоциативный массив functions
содержит ключ _expand-aliases
, и 0 в противном случае. Это описано в руководстве как ${+name}
. Под записью ${name}
в руководстве поясняется, что фигурные скобки не являются обязательными. Я не думаю, что в руководстве прямо указано, что вы можете использовать имя массива с индексом вместо имени. Руководство по zsh читать нелегко.
Массив functions
— это «магический» ассоциативный массив, привязанный к определениям функций. При определении функции к этому массиву добавляется элемент, где ключ — это имя функции, а значение — тело функции, нормализованное. Наоборот,добавление элемента в массив определяет функцию с заданным именем и телом.
unset 'functions[_expand-aliases]' # unset any previous function
functions[_expand-aliases]=$BUFFER # define a function whose body is the content of the command line
(($+functions[_expand-aliases])) && # if the command line is a syntactically correct function body, then …
BUFFER=${functions[_expand-aliases]#$'\t'} && # set the command line to the normalized function definition
CURSOR=$#BUFFER # move the cursor to the end of the command line
Если бы functions
был обычным массивом, это не изменило бы значение BUFFER
(, за исключением удаления начального табулятора ), и проверка в третьей строке всегда была бы истинной. Но из-за «волшебной» природы functions
вы получаете не то, что вкладываете, а нормализованную версию — в частности, с расширенными псевдонимами. Тест в третьей строке не пройден, если определение функции синтаксически неверно.
Поскольку вы отправляете содержимое скрипта, я предлагаю вам ввести в него аргументы с помощью команды set
для установки позиционных параметров:
ssh -tt "${!SERVER_ADDRESS}" <<END
set -- "arg 1" "arg 2" "arg 3"
$(cat $SCRIPT_PATH)
END