문맥
파일이 있습니다 my-cmd
.
echo '<some data...>\\<some other data...>'
기본적으로 이 명령의 출력을 텍스트 파일로 리디렉션하고 싶습니다.
./my-cmd > file.txt
질문
내 문제는 항상 to 의 >
모든 항목을 바꾸는 것 입니다 .\\
\
file.txt
이 동작을 방지하려면 어떻게 해야 합니까?
답변1
my-cmd
다음과 같이 하면 :
echo "abc\\def"
출력은 다음과 같습니다 abc\def
. 백슬래시는 큰따옴표 안의 이스케이프 문자로 해석됩니다. OTOH, 작은따옴표 안의 리터럴 백슬래시로 처리됩니다.
echo 'abc\\def'
abc\\def
출력으로 생성됩니다 .
편집: 이것은 bash로 테스트되었습니다. OP는 태그를 "zsh"로 변경했기 때문에 그의 질문에 대한 답변이 아닙니다. 지금 운영자님이 쓸데없는 내용이라고 생각하시면 삭제하겠습니다.
답변2
echo
이식할 수 없는 명령이며 해당 동작은 구현, 버전, 컴파일 타임 및 런타임 옵션, 환경에 따라 다릅니다.
-
특히 첫 번째 인수가 다음으로 시작하거나(zsh의 내장 함수가 echo
이 문제를 해결할 수 있는 드문 구현 중 하나임에도 불구하고) 인수에 백슬래시 문자가 포함된 경우에는 사용해서는 안 됩니다.
특히, zsh
echo
내장 구현 의 경우 옵션이 활성화되어 있지 않으면(대부분의 경우 기본적으로 비활성화되어 있음 ) 기본 제공 구현의 경우 \
시퀀스(예: \n
, \c
, ...) \61
는 \\
POSIX+XSI에서 요구하는 대로 확장되지만 XSI가 없는 POSIX는 지정되지 않은 동작을 유지합니다. bsdecho
배포) 활성화된 경우 bash
에만 xpg_echo
확장되기 때문입니다(대부분의 배포에서는 기본적으로 비활성화됨).
zsh
및 s는 모두 확장을 비활성화하는 bash
echo
(비표준) -E
옵션을 지원합니다( 및 옵션이 bash
모두 xpg_echo
활성화된 경우 s는 활성화되지 않음).posix
여기서도 이것을 할 수 있습니다:
echo -E '<some data...>\\<some other data...>' > file
zsh
대부분의 배포에서 잘 작동합니다 bash
. 표준 명령을 사용하는 것이 더 나을 것입니다 printf
.
printf '%s\n' '<some data...>\\<some other data...>' > file
이 경우 동작은 POSIX에 의해 완전히 지정되며 모든 구현에서 동일합니다.
이 printf
유틸리티는 POSIX 발명품이라는 점에 유의하십시오. POSIX 이전에 echo
이러한 이식 불가능한 혼란에 대한 Korn 쉘의 솔루션은 새로운 print
내장 기능과 시퀀스를 -r
확장하지 않는 옵션 및 옵션의 끝을 표시하는 옵션이었습니다. 실제로 Korn과 유사한 내장 기능이 있지만 그렇지 않습니다.\x
-
zsh
print
bash
ksh 및 zsh에서는 다음을 수행할 수도 있습니다.
print -r - "$var"
모든 데이터를 있는 그대로 인쇄합니다.
자세한 내용은 다음을 참조하세요.
답변3
~에 따르면프레디가 뭐라고 했어?댓글에서니카드의 대답, my-cmd
해야 한다:
/bin/echo -E '<some data...>\\<some other data...>'
zsh
그래서 기본적 으로 , 내가아니요 bash
, 기본적으로 백슬래시 문자를 특별히 처리하는 명령을 사용합니다 echo
. zsh
사용하려는 명령을 지정해야 /bin/echo
하고 -E
해당 옵션을 사용하여 호출해야 합니다.
man echo
이 -E
옵션 에 대한 설명 은 다음과 같습니다 .
-E disable interpretation of backslash escapes
답변4
답변
아시다시피 이는 >
출력 리디렉션 연산자입니다(본질적으로 명령의 출력을 특정 위치로 리디렉션한다는 의미).
여러 출력을 동일한 파일로 리디렉션하려면 이 >>
명령을 사용해야 합니다. 명령과 동일한 구문을 사용 >
하지만 이전에 리디렉션된 데이터를 완전히 다시 작성/제거하는 대신 아래에 추가합니다.
예/구문
./my-cmd > file.txt
그러니 하지 마세요../my-cmd >> file.txt