Bash에서 느낌표를 올바르게 이스케이프 처리하는 방법은 무엇입니까?

Bash에서 느낌표를 올바르게 이스케이프 처리하는 방법은 무엇입니까?

오늘 저는 트위터의 비밀번호 생성기에 대한 골프 코드를 작성하려다 적발되었습니다.

import string as s,random;print ''.join(random.sample(s.letters+s.digits+s.punctuation,9))

90자. 여유 공간이 많아서 기준을 높여 실행 가능하게 만들기로 결정했습니다.

echo -e "#!/usr/bin/python\nimport string as s,random;print ''.join(random.sample(s.letters+s.digits+s.punctuation,9))">pg;chmod +x pg;./pg

139자. bash가 분명히 느낌표 때문에 질식한다는 점을 제외하면 괜찮습니다.

badp@delta:~$ echo -e "#!/usr/bin/python\nimport string as s,random;print ''.join(random.sample(s.letters+s.digits+s.punctuation,9))">pg;chmod +x pg;./pg
bash: !/usr/bin/python\nimport: event not found

짜증나는 느낌표. "도망가자"라고 생각했어요! 결국 백업 캐릭터가 생겼습니다.

echo -e "#\!/usr/bin/python\nimport string as s,random;print ''.join(random.sample(s.letters+s.digits+s.punctuation,9))">pg;chmod +x pg;./pg

확실히...

badp@delta:~$ echo -e "#\!/usr/bin/python\nimport string as s,random;print ''.join(random.sample(s.letters+s.digits+s.punctuation,9))">pg;chmod +x pg;./pg
./pg: line 2: syntax error near unexpected token `('
./pg: line 2: `import string as s,random;print ''.join(random.sample(s.letters+s.digits+s.punctuation,9))'
badp@delta:~$ cat pg
#\!/usr/bin/python
import string as s,random;print ''.join(random.sample(s.letters+s.digits+s.punctuation,9))

나의 어리석은 골프 코드는 제쳐두고 - 나는 이것을 설명할 수 없다.

를 사용하면 \!느낌표가 이스케이프되지만 픽업을 \!위해 그대로 남아 있기 때문에 실제로는 그렇지 않습니다 echo.

한 가지 해결책은 대신 사용하는 것이지만 \x21이것이 bash 명령에서 느낌표를 이스케이프 처리하는 올바른 방법이라고 생각하지 않습니다.

간단히 말해서:bash 명령에서 느낌표를 올바르게 이스케이프 처리하는 방법은 무엇입니까?

답변1

작은따옴표를 사용하세요.

echo -e '#!/usr/bin/python\nimport string as s,random;print "".join(random.sample(s.letters+s.digits+s.punctuation,9))'>pg;chmod +x pg;./pg

나중에 규칙은 !다른 인용 규칙(csh에서)으로 이식되었습니다. 쉘에 명령줄 편집 기능이 없을 때 유용했지만 일부 사람들은 여전히 ​​이를 사용합니다.

추신: bash를 코딩하고 있으므로:

echo $'#!/usr/bin/python\nimport string as s,random;print"".join(random.sample(s.letters+s.digits+s.punctuation,9))'>pg;chmod +x pg;./pg

이것은 대부분의 unice에서 작동합니다.

echo python -c \''import string as s,random;print"".join(random.sample(s.letters+s.digits+s.punctuation,9))'\'>pg;chmod +x pg;./pg

(왜 스크립트를 작성하려는지, 스크립트 이름이 왜 두 글자여야 하는지 이해가 안 갑니다.)

답변2

물어보기 전에 구글링을 해봤어야 했는데.

변수 [..]를 확장하기 위해 bash에 의존하지 않으므로 작은따옴표를 사용할 수 있습니다. 작은따옴표로 묶인 문자열은 bash로 확장되지 않습니다.

울리다존재하다회신하다도착하다느낌표를 피하는 방법은 무엇입니까?

관련 정보