소스에서 변수를 상속하면 현재 변수를 덮어씁니다.

소스에서 변수를 상속하면 현재 변수를 덮어씁니다.

Index.sh 파일:

#!/bin/sh
source "global.sh"
echo "${CODE_DIR}/SOMETHING"

전역 .sh 파일:

#!/bin/sh
APP_DIR="/app001/Documents/files/" 
CODE_DIR="${APP_DIR}/code"

index.sh를 실행하면:

예상 출력:/app001/Documents/files/code/SOMETHING

산출:/SOMETHINGcuments/files//code

왜? 이 문제를 해결하는 방법은 무엇입니까?

답변1

global.sh이는 파일이 줄 끝을 캐리지 리턴과 개행 문자로 인코딩하는 DOS로 형식화되었기 때문에 발생합니다 .

Linux/Unix는 개행 문자를 개행 문자로만 처리하므로 캐리지 리턴 문자는 변수 내용의 일부가 됩니다 ${CODE_DIR}.

캐리지 리턴을 에코하면 커서가 줄의 시작 부분으로 돌아갑니다. 이것이 이 예에서 일어나는 일입니다. 먼저 인쇄를 시작한 /app001/Documents/files//code다음 ${CODE_DIR}해당 변수 끝에 있는 캐리지 리턴이 커서를 줄의 시작 부분으로 다시 이동하고 해당 /SOMETHING부분이 문자열의 시작 부분을 덮어씁니다.

상상할 수 있듯이 출력을 파이핑하면 cat -v모든 문자가 표시되고 캐리지 리턴이 다음과 같이 표시됩니다 ^M.

$ ./index.sh | cat -v
/app001/Documents/files//code^M/SOMETHING

이 문제를 해결하려면 개행 문자를 Unix 형식으로 변환하세요 . 이 도구(컴퓨터에서 사용 가능한 경우)를 global.sh사용하면 됩니다 .dos2unix

$ dos2unix global.sh

또는 Vim에서 파일을 열고 변환하세요.

$ vim global.sh
:set ff=dos
:wq

index.shDOS 줄 끝이 있는지 다른 파일(예: )을 확인할 수도 있습니다 . global.shDOS 파일 끝이 발생하는 이유를 확인하고 수정할 수도 있습니다 . 텍스트 편집기를 사용하여 이러한 파일을 만든 경우 텍스트 편집기가 항상 Unix 줄 끝을 사용하도록 올바르게 구성되었는지 확인하세요.

관련 정보