Странное поведение эха
Чтобы свести это: Следующая команда в 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'