변수의 내용이 변경된 것 같습니다.

변수의 내용이 변경된 것 같습니다.

디렉토리 경로가 있는 변수가 있습니다. 콘텐츠를 시도 하면 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이 있습니다. ( 0d16진수 덤프의 마지막 문자 로 간주됩니다 .)

또한 오류 메시지가 디렉터리 경로를 덮어쓰는 이유도 설명합니다. 보통 당신은 얻을 것입니다

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가 언급했듯이 변수에는 부주의한 것 이상의 내용이 포함되어 있습니다. 에코 출력 후 빈 줄을 보셨나요?

답변3

실제로 '\r' 및 '\n' 문자가 있습니다. 다음을 사용하여 제거했습니다.

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

관련 정보