나는 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/sh
Make는 기본적으로 사용되는 셸을 통해 명령을 실행 하거나 데비안에서는 대시를 실행합니다. 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/sh
is 때문일 가능성이 높습니다 .dash
쉬운 수정 방법이 있습니다. 백슬래시를 인용하려면 또 다른 백슬래시를 추가하세요.
test-makefile:
echo '\\newcommand{\\seance}{seance1}' > seances/seance.tex
POSIX 표준은 C 백슬래시 이스케이프를 다음 echo
과 같이 표시합니다.XSI 확장그러나 POSIX 준수 테스트 스위트의 작성자는 임베디드 사용을 위해 소규모 시스템을 확인하려는 것이 아니라면 POSIX를 준수하려면 XSI를 준수해야 한다고 주장합니다.
원래 질문은 소규모 임베디드 시스템에 대한 것이 아닌 것 같기 때문에 해당 시스템은 호환되도록 XSI 확장을 구현해야 합니다.
bash
Solaris 및 Mac OS와 같은 POSIX 인증 플랫폼에서는 기본적으로 호환되는 방식으로 컴파일이 수행 됩니다 echo
. 따라서 bash가 기본적으로 POSIX XSI와 호환되지 않는 문제는 Linux에만 해당됩니다.