2013-02-21 3 views
2

나는 간단한 스크립트는 printf와 출력을 파일로 리디렉션해야하지만 나는이 작업을 수행 할 때bash에서 감탄 부호를 인쇄하는 방법은?

배쉬 :!/빈/bash는 \ ntouch : 이벤트

printf "#!/bin/bash\ntouch /tmp/1234567890_$RUN" > /tmp/password-change-script_$RUN.sh 

나는이 오류 나는 느낌표 벗어날 경우

를 찾을 수 없습니다

printf "#\!/bin/bash\ntouch /tmp/1234567890_$RUN" > /tmp/password-change-script_$RUN.sh 

그런 다음 이스케이프 문자는 여전히 파일에 존재한다.

cat /tmp/password-change-script_$RUN.sh 
#\!/bin/bash 
touch /tmp/1234567890_111 

그러나이 특별한 경우에는 #!/bin/bash가 파일에 있어야합니다. 어떤 이유로 스크립트를 실행하는 바이너리 파일은 그렇지 않으면 파일을 읽지 않습니다.

답변

7

참조,하지만 작은 따옴표로 묶인 문자열.

printf '#!/bin/bash\ntouch /tmp/1234567890_'"$RUN" 

자체적으로 또는 단어 끝에 표시 될 때도 확장되지 않습니다. 이 깨끗한 것이 아니라 :

printf "#%c/bin/bash\ntouch /tmp/1234567890_$RUN" ! 

당신은 일시적으로 (일시적으로) 빈 문자열로 $histchars을 설정하여 역사 치환을 해제 할 수 있습니다; 이 !의 특별 대우 꺼집니다 :

histchars= 
printf "#!/bin/bash\ntouch /tmp/1234567890_$RUN" 
unset histchars 

또는 대화 형 스크립트가 아니라에서 printf 명령을 실행할 수 있습니다 (역사 치환은 대화 형 쉘에 기본적으로 설정되어 있습니다).

+0

아, 그 말이 맞는이 모두 단일 및 큰 따옴표로 작동합니다. – David

+0

좋은 캐치 ................! – Satish

+0

@David : 몇 가지 대안으로 내 대답을 업데이트했습니다. –

6

이 일을보십시오 :

printf "\041" 

! 문자

의 진수 ASCII 표현

man ascii 

를 참조하십시오 또 다른 솔루션 :

(괄호는 를 서브 쉘 A의 단말기 설정을 변경하는 데 사용됩니다, 그래서 변화는 일시적)

! 문자를 두 번 인용 문자열로 확장

help set 
set -o 
+0

감사합니다. 나는 그런 생각을하지 않았다. – David

+0

사실 이것은 작은 따옴표로만 작동하며 printf '!'도 마찬가지입니다. – David

+0

내 편집 된 게시물에서 내 두 번째 솔루션을 참조하십시오. –

관련 문제