확장을 방지하기 위해 백슬래시를 사용하지 않고 출력에 느낌표를 표시하는 방법

확장을 방지하기 위해 백슬래시를 사용하지 않고 출력에 느낌표를 표시하는 방법

나는 보통 echo느낌표가 있는 특정 문자열을 좋아합니다. 비록 나는알다쉘 확장을 방지하기 위해 탈출하는 방법을 알아냈습니다.반품백슬래시 인쇄...

echo "\!" # will print \! instead of just !

다른 도구와 반대 sed다른 도구와 반대확실히가능한 유효한 인수의 확장을 방지하기 위해 사용되는 경우 sed백슬래시를 인쇄합니다.

echo "test" | sed 's/^\(.*\)$/\1 \!/' # print -> test !
echo "test" | sed 's/^\(.*\)$/\1 !/' # also print -> test !
echo "test" | sed "s/^\(.*\)$/\1 ! /" # also print -> test !, though needed to put a space or use a backslash for it to show correctly

동일한 작업을 어떻게 수행할 수 있습니까? echo아니면 와 같은 다른 도구를 사용해야 합니까 sed?

편집하다:

''위의 ""예 대신 사용하면 쉘 확장 없이(백슬래시 유무와 상관없이) 인쇄 echo됩니다 .!

  • 사람들이 명령 대체를 사용하려고 하면 echo다음에서만 작동하기 때문에 작동하지 않습니다 "".

답변1

넌 그걸 탈출해야 해또는인용하세요. 둘 다는 아닙니다.

echo \!
echo "!"

Bash 기록 확장은 이스케이프된 느낌표, 작은따옴표로 묶인 느낌표, 닫는 큰따옴표 앞에 나타나는 느낌표를 무시합니다. 바라보다매뉴얼의 역사적인 대화형 섹션더 알아보기. 그래서

echo '!'

또한 작동하며 느낌표가 어디에 있는지 생각할 필요가 없습니다.

printf대체를 사용하여 작은따옴표를 변수 확장과 결합 할 수 있습니다 echo. 동일한 명령줄에서 여러 형식의 인용을 결합할 수도 있습니다.

echo '!'"$(echo test)"

그러나 일반적으로,printf비교하다echo. 다른 사람들이 언급했듯이 기록 확장을 완전히 비활성화할 수도 있습니다. 비대화형 쉘은 기본적으로 활성화하지 않습니다.

관련 정보