오늘 저는 트위터의 비밀번호 생성기에 대한 골프 코드를 작성하려다 적발되었습니다.
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로 확장되지 않습니다.
울리다존재하다회신하다도착하다느낌표를 피하는 방법은 무엇입니까?