[вы должны задать другой вопрос о другой проблеме, вместо того, чтобы копаться в этом]
Когда вы запускаете ssh
с [command]
аргументами, как в ssh user@host foo bar baz
, происходит следующее: его аргументы будут объединены пробелами в один аргумент, который будет передан через -c
] переключиться на оболочку входа пользователя на удаленной машине (, если эта оболочка /bin/sh
, /bin/sh -c 'foo bar baz'
будет запущена ).
Теперь, что происходит в вашем примере:
echo yup | ssh admin@trg14 ksh -c 'exec 4<&0; ksh -c "rev <&5" 5<&4'
заключается в том, что аргументы ssh будут объединены в строку:
ksh -c exec 4<&0; ksh -c "rev <&5" 5<&4
и сначала запустится оболочка на удаленной машине
ksh -c exec 4<&0
, а затем
ksh -c "rev <&5" 5<&4
как две отдельные команды, и конечно fd 4 во второй ни на что не указывает, потому что он был только перенаправлен в первой команде.