变量的内容似乎发生了变化

变量的内容似乎发生了变化

我有一个带有目录路径的变量。如果我echo它的内容它会输出正确的路径,但如果我尝试cd它不会输出正确的路径,并且它似乎/home/user/从路径中删除:

[user@project]$ echo $PROJECT_DELIVERY
/home/user/projects/ws/project/delivery/project_name_0.1.0
[user@project]$ cd $PROJECT_DELIVERY
: No such file or directoryuser/projects/ws/project/delivery/project_name_0.1.0

这是内容printf %s "$PROJECT_DELIVERY" | xxd

[a27503408@ded30325 install]$ printf %s "$PROJECT_DELIVERY" | xxd
0000000: 2f68 6f6d 652f 6132 3735 3033 3430 382f  /home/user/
0000010: 7072 6f6a 6563 7473 2f61 7332 3530 2f41  projects/as250/A
0000020: 5332 3530 5f4d 3135 3533 5f54 4d54 432f  S250_M1553_TMTC/
0000030: 6465 6c69 7665 7279 2f41 5332 3530 5f4d  delivery/AS250_M
0000040: 3135 3533 5f54 4d54 435f 302e 312e 300d  1553_TMTC_0.1.0.

知道什么可能导致这种行为吗?我正在使用 bash 4.1.2(1)

答案1

目录名称中有一个尾随 CR。 (将 视为0d十六进制转储中的最后一个字符。)

这也解释了为什么目录路径被错误消息覆盖。通常你会得到

cd /qwerty
-bash: cd: /qwerty: No such file or directory

但您得到的结果与此相同,其中主要信息已被 CR 和后续错误消息覆盖:

cd /qwerty
: No such file or directory

试试这个来证明这一点:

echo "$PROJECT_DELIVERY<"

\r您可以使用如下结构删除尾随字符

r=$'\r'                                      # Or r=$(printf "\r")
PROJECT_DELIVERY="${PROJECT_DELIVERY%$r}"    # Strip the CR from the end

答案2

正如@Kusalananda 评论的那样,您的变量包含的内容超出了粗心的范围。看到 echo 输出后的空行了吗?

答案3

确实有 '\r' 和 '\n' 字符。我用以下方法删除了它们:

VARIABLE="$(echo "$VARIABLE"|tr -d '\n'|tr -d '\r')"

相关内容