bash/debian: 이상한 메이크파일 동작

bash/debian: 이상한 메이크파일 동작

나는 TeX에서 매우 간단한 makefile을 사용하고 있습니다:

test-makefile:
    echo '\newcommand{\seance}{seance1}' > seances/seance.tex

나는 그것을 실행합니다 :

$ make test-makefile 
echo '\newcommand{\seance}{seance1}' > seances/seance.tex

내 문제는 "seances"라는 폴더에 생성된 파일에 포함되어야 하는 처음 두 문자가 포함되어 있지 않다는 것입니다.


ewcommand{\seance}{seance1}

첫 번째 줄은 비어 있습니다.

물론 첫 번째 백슬래시 echo '\\newcommand{\seance}{seance1}등을 보호할 수 있습니다. 하지만 현실 세계에서는 작동하지 않습니다. 내 실제 makefile(ECM을 출시했습니다)이 작동하지 않습니다.

무슨 일이야? bash/debian이 어떻게 명령의 시작 부분을 오해할 수 있습니까?



덧붙여서:

$ bash --version
GNU bash, version 4.4.19(1)-release (x86_64-pc-linux-gnu)
$ cat /etc/debian_version
buster/sid
$ uname -a
Linux giljourdan 4.16.0-1-amd64 #1 SMP Debian 4.16.5-1 (2018-04-29) x86_64 GNU/Linux

답변1

당신은 echo그 설명자 중 하나입니다백슬래시 이스케이프. A는 \n개행을 의미하므로 아이디어를 얻을 수 있습니다. 후자의 백슬래시는 \s유효한 이스케이프 코드가 아니기 때문에 있는 그대로 나타납니다 .

/bin/shMake는 기본적으로 사용되는 셸을 통해 명령을 실행 하거나 데비안에서는 대시를 실행합니다. Dash의 내장 기능은 echo백슬래시를 처리합니다. 배쉬는 그렇지 않습니다. ( /bin/echo명시적으로 실행하지 않는 한 Debian의 외부는 중요하지 않습니다 /bin/echo.)

가장 좋은 옵션은 명시적으로 사용하는 것입니다 printf. 이는 항상 백슬래시 이스케이프를 처리하므로 적어도 안전합니다. 다음은 항상 동일한 작업을 수행해야 합니다. 즉, \\n시작 부분에 실제 백슬래시를 생성하고 줄 끝 부분에 n개행 문자를 생성해야 합니다 .\n

foo:
        printf '\\newcommand\n' > foo

(혹은 원하신다면피하다백슬래시를 처리한 다음 printf "%s" '\newcommand')

이슈 보기왜 printf가 echo보다 나은가요?트랩에 대한 자세한 내용 echo.

답변2

귀하의 echo프로그램은 POSIX와 호환되며 C 백슬래시 이스케이프를 확장합니다. 이는 bash가 아니라 /bin/shis 때문일 가능성이 높습니다 .dash

쉬운 수정 방법이 있습니다. 백슬래시를 인용하려면 또 다른 백슬래시를 추가하세요.

 test-makefile:
        echo '\\newcommand{\\seance}{seance1}' > seances/seance.tex

POSIX 표준은 C 백슬래시 이스케이프를 다음 echo과 같이 표시합니다.XSI 확장그러나 POSIX 준수 테스트 스위트의 작성자는 임베디드 사용을 위해 소규모 시스템을 확인하려는 것이 아니라면 POSIX를 준수하려면 XSI를 준수해야 한다고 주장합니다.

원래 질문은 소규모 임베디드 시스템에 대한 것이 아닌 것 같기 때문에 해당 시스템은 호환되도록 XSI 확장을 구현해야 합니다.

bashSolaris 및 Mac OS와 같은 POSIX 인증 플랫폼에서는 기본적으로 호환되는 방식으로 컴파일이 수행 됩니다 echo. 따라서 bash가 기본적으로 POSIX XSI와 호환되지 않는 문제는 Linux에만 해당됩니다.

관련 정보