Потому что bash играет с пробелами, если вы позволите.Позвольте мне объяснить:
$(typeset -f func)
оценит typeset -f func
и вставит его вывод в текущую командную строку.Если не заключено в кавычки, он также будет сегментирован на параметры, которые будут иметь побочный эффект свертывания всех пробелов в одно пространство.Таким образом, если typeset -f func
напечатает (как это происходит в моей системе)
func ()
{
/bin/ls --color=auto ~/
}
, то, что вы получите с $(typeset -f func)
, будет
func () { /bin/ls --color=auto ~/ }
(попробуйте echo $(typeset -f func)
, если вы неНе верьте мне: D)
Теперь bash очень стесняется принимать замаскированный код.Например, вы можете знать, что это не грамматически:
if true then echo "yes" fi
и это:
if true; then echo "yes"; fi
Таким же образом закрывающая скобка определения функции является разборчивой.Таким образом, это работает:
func () { /bin/ls --color=auto ~/; }
, но это не так:
func () { /bin/ls --color=auto ~/ }
По какой-то причине bash подходит для ключевого слова перед скобкой:
func () { /bin/ls --color=auto ~/; if [[ -n 1 ]]; then echo "Hello"; fi }
func () { /bin/ls --color=auto ~/; while false; do echo "Here"; done }
Чтобы бороться с этим ... попробуйте не посылать материал из командной строки, который искажает ваш пробел, но из перенаправления:
ssh -A -T user@machine_ip < <(typeset -f func; echo func)
Или, проще всего, предотвратить bash
искажениепробелов в двойных кавычках:
ssh -A -T user@machine_ip "$(typeset -f func)
func"