奇怪的回声行为

奇怪的回声行为

简而言之: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

我不明白为什么 echo 会产生最后一行。它似乎正在写入行号。我是不是忘了转义某些内容?

答案1

对此有一个简单的解释。从远程服务器检索到的值都带有尾随回车符 ( \r)。

你期待的是这个:

www-data101

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

但是www-data644后面跟着一个回车符。如果终端仿真器将 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'

相关内容