Я не совсем понимаю, почему команда может зависнуть, но вам не нужно запускать весь конвейер на сервере. Достаточно сделать ls
там:
backup_folder=$( ssh -i keyfile "$server" "ls -t -- '$dir'" | head -n 1 )
Обратите внимание, что это кавычки $dir
значение на удаленной стороне (, оно все равно будет расширено локально ). head
будет работать локально.
Это также связано с предостережениями, упомянутыми в ответах на «Почему *не *parse `ls`(и что делать вместо этого )? ».