如何正确摆脱bash中的感叹号?


11

今天,我在尝试对Twitter的密码生成器进行编码时被捕。

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个字符。不错,除了在惊叹号上明显的b子声。

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命令中转义感叹号的正确方法。

tl; dr:您如何正确地在bash命令中转义感叹号?


真的有人!event首先使用语法吗?总是给我带来麻烦。
badp 2010年

我几乎每天都使用它(过去20年中的大部分时间), !:0 !$!^节省了很多时间和打字。
Alexx Roche

Answers:


7

使用单引号:

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)。当shell没有命令行编辑时,它们非常有用,但是现在有些人仍在使用它们。

PS由于您正在为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

这适用于大多数unices:

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

(不是我知道为什么要创建脚本或为什么脚本名称必须为两个字母。)


不知道$''。:) PS:这是试图用尽那些多余的字符。当我发布少于140个字符的推文时,我会感到浪费。
badp 2010年

@badp:因此,请尝试使其生成令人难忘的密码。(pwgen与vs.一样pwgen -s
吉尔斯(Gills

最好将dadadodo用于难忘但荒谬的密码短语:)
badp 2010年

1

我应该先问一下Google。

由于您不依赖bash来扩展变量[..],因此可以改用单引号。bash不扩展单引号中的字符串。

回复我如何逃脱一个感叹号?


1
不过,我并未将此答案标记为已接受,因为它只能回答此特定情况。通常,没有扩展就无法逃脱。
badp 2010年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.