Странное поведение эха

Чтобы свести это: Следующая команда в Bash

echo $(ssh -t pi@doctor "sudo stat -c \"%U\" /var/www/candy/example/index.html")101

Дает этот результат

Connection to doctor closed.
101-data

В то время как

echo $(ssh -t pi@doctor "sudo stat -c \"%U\" /var/www/candy/example/index.html")

дает

Connection to doctor closed.
www-data

Почему это?

Справочная информация: я использую этот скрипт (называется ced.sh):

for ARG; do
        name=${ARG##*/}
        echo name=$name
        path=${ARG%/*} 
        echo path=$path
        owner=$(echo $(ssh -t $remote_user@$server "sudo stat -c \"%U\" $ARG"))
        echo owner=$owner
        group=$(echo $(ssh -t $remote_user@$server "sudo stat -c \"%G\" $ARG"))
        echo group=$group
        perms=$(echo $(ssh -t $remote_user@$server "sudo stat -c \"%a\" $ARG"))
        echo perms=$perms
        read -p "Gibt es einen Dienst/Server, der auf diese Datei zurückgreift (notfalls leer lassen)? " service
        echo service=$service
        echo "name="\"$name\" "path="\"$path/\" "owner="\"$owner\" "group="\"$group\" "perms="$perms "service="$service
done

Его целью является чтение некоторой информации (например, владельца, группы, прав доступа) из файлов на сервере, которую я хотел бы редактировать локально. Последняя строка должна выдавать результат, который можно сохранить в файле.

Это было бы переписано:

echo "name="\"$name\" "path="\"$path/\" "owner="\"$owner\" "group="\"$group\" "perms="$perms "service="$service >> "$HOME/...bla bla..."

Вывод выглядит так:

Software/EigeneProgramme/ced.sh -p /var/www/candy/example/index.html
name=index.html
path=/var/www/candy/example
Connection to doctor closed.
owner=www-data
Connection to doctor closed.
group=www-data
Connection to doctor closed.
perms=644
Gibt es einen Dienst/Server, der auf diese Datei zurückgreift (notfalls leer lassen)? apache
service=apache
 service=apacheta path="/var/www/candy/example/" owner="www-data

Я не понимаю, почему эхо производит последнюю строку. Кажется, что он пишет, чтобы выстроиться на. Я забыл что-то избежать?

1 ответ

Этому есть простое объяснение. Все значения, полученные с удаленного сервера, поставляются с завершающим символом возврата каретки (\r).

Вы ожидали этого:

www-data101

name="index.html" path="/var/www/candy/example/" owner="www-data" group="www-data" perms=644 service=apache

Но www-data а также 644 сопровождаются возвратом каретки. Если CR будет отображаться как новая строка вашим эмулятором терминала, то вывод будет выглядеть так:

www-data
101

name="index.html" path="/var/www/candy/example/" owner="www-data
" group="www-data
" perms=644
 service=apache

Без перевода строки линии перекрываются; точки обозначают перезаписанные символы.

...-data
101

................. path="/var/www/candy/example/" owner="www-data
...............ta
...........
 service=apache

Как вы уже отметили, на большинстве терминалов это выглядит так:

101-data

 service=apacheta path="/var/www/candy/example/" owner="www-data

Вы можете убедиться в этом, отправив удаленный вывод на cat -v; возврат каретки будет отображаться как ^M,

ssh -t pi@doctor "sudo stat -c \"%U\" /var/www/candy/example/index.html" | cat -v

Одно из возможных решений - снять возврат каретки, пропустив удаленный выход через tr -d '\r':

ssh -t pi@doctor "sudo stat -c \"%U\" /var/www/candy/example/index.html" | tr -d '\r'
Другие вопросы по тегам