如何回应#!/使用shell或bash

时间:2014-10-28 12:33:28

标签: bash

我正在尝试通过Bash打印#!/,但它不打印它,而是打印以下内容。

parth@parth-ubuntu64:$ echo "#!\/"
bash: !\/: event not found

EDITED: 请允许我再做一次更新。你如何做以下工作?我想我应该使用python而不是bash。我试图这样做的原因是因为,我想把它管道到一个需要sudo权限的文件中。这是我可以执行sudo =>的唯一方法。 sudo sh -c“echo something> file”

sh -c 'echo \'#!/bin/bash \' '

5 个答案:

答案 0 :(得分:4)

在双引号内(并启用了历史记录扩展),!具有特殊含义。要按字面打印这些字符,请使用单引号而不是双引号:

$ echo '#!\/'
#!\/

可以使用set +H在交互式shell中禁用历史记录扩展,这允许您使用双引号:

$ set +H
$ echo "#!\/"
#!\/

通常,如果不需要插入变量(例如在这种情况下),则应使用单引号。

请注意,没有必要转义/,因此如果您的所需输出为\,则可以从#!/之前移除$ echo '#!/' #!/

{{1}}

答案 1 :(得分:2)

在交互式shell中!受历史扩展的影响。例如,!!是您键入的最后一个命令,!$是该命令的最后一个参数。为避免历史记录扩展,请使用反斜杠转义!或使用单引号。

echo '#!/'

这在shell脚本中是必需的,仅在交互式shell中有效(除非您在shell脚本中有意启用set -o historyset -o histexpand)。

  

请允许我再进行一次更新。你如何做以下工作?

sh -c 'echo \'#!/bin/bash \' '

单引号内无法使用单引号。 \'不起作用。所以我们回到双引号。

sh -c "echo '#\!/bin/bash'"

答案 2 :(得分:1)

有些内容在双引号内解释,包括由感叹号引入的反斜杠和历史事件。请使用功能更强大的单引号:

echo '#!\/'

答案 3 :(得分:0)

您需要将文本放在单引号内,以便它不会解析。

$ echo '#!/'
#!/
$ echo '#!\/'
#!\/

答案 4 :(得分:0)

使用单引号而不是双引号。

echo '#!/'