我有一个带有目录路径的变量。如果我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')"