Bash에서는 파일에서 \로 시작하는 줄을 찾고 백틱을 사용하여 결과를 반환하려고 합니다.
예를 들어:
echo \\Hello > myFile
out=`cat myFile | grep '^\\Hello'`
echo $out
아무것도 반환되지 않더라도
cat myFile | grep '^\\Hello'
예상대로 반환됩니다.
\Hello
이것은 매우 이상한 쉘 동작처럼 보입니다. 특히 tcsh의 유사한 명령 시퀀스는 예상한 대로 수행됩니다.
set out=`cat myFile | grep '^\\Hello'`; echo $out
반품
\Hello
무슨 일인지 설명해 줄 수 있는 사람이 있나요? 감사해요
답변1
읽다http://mywiki.wooledge.org/BashFAQ/082특히
백틱 내의 백슬래시는 명확하지 않은 방식으로 처리됩니다.
:
`...`
가장 오래된 비POSIX 호환 Bourne-Shell에만 필요한 레거시 구문입니다. 항상 Syntax 를 선호하는 데는 여러 가지 이유가 있습니다 $(...)
.
echo \\Hello > myFile
대신에
out=$(cat myFile | grep '^\\Hello')
조금 단순화하려면 다음을 수행하십시오.
out=$(grep '^\\Hello' myFile)
그 다음에
echo $out
공백/메타 문자를 포함하는 각 리터럴에 대한 "큰따옴표" 및모든확장자: "$var", "$(명령 "$var")", "${array[@]}", "a & b". 코드 또는 리터럴 $: "costs $5", ssh 호스트 "echo "$HOSTNAME""을 나타내려면 "작은따옴표"를 사용하십시오. 바라보다http://mywiki.wooledge.org/Quotes,http://mywiki.wooledge.org/Arguments그리고http://wiki.bash-hackers.org/syntax/words.
그래서 결국:
echo \\Hello > myFile
out="$(grep '^\\Hello' myFile)"
echo "$out"