为什么我不能回应人物#!在bash中的字符串?

时间:2014-02-01 04:52:31

标签: bash

我有一个小的bash脚本应该移动到我的主目录,创建一个文件,回收一些垃圾,并使其可执行。这就是它的样子:

cd ; touch tor.sh; echo "#!/bin/bash\n/usr/local/bin/tor" >> tor.sh; chmod +x tor.sh

但这仍然在回声中打破,抱怨“未找到事件”?出于某种原因,我决定尝试这个并且它有效:

cd ; touch tor.sh; echo -e "\x23\x21/bin/bash\n/usr/local/bin/tor" >> tor.sh; chmod +x tor.sh

为什么我必须用十六进制和-e替换这两个字符(shebang?)?有更好的方法吗?

5 个答案:

答案 0 :(得分:4)

这不是一个错误,它与shebang无关,只是感叹号。

Enclosing  characters  in double quotes preserves the literal value of
all characters within the quotes, with the exception of $, `, \,  and,
when  history expansion is enabled, !.

因此,要么逃避它,使用单引号,要么关闭历史记录扩展。

e.g。

> echo "How dare you put an '!' in this string?"
bash: !: event not found
> set +o histexpand
> echo "How dare you put an '!' in this string?"
How dare you put an '!' in this string?

答案 1 :(得分:1)

您应该使用单引号来防止字符串外推:

echo '#!/bin/bash\n/usr/local/bin/tor'

或者你可能逃脱了shebang:

echo "#\!/bin/bash\n/usr/local/bin/tor"

答案 2 :(得分:1)

尝试'代替"这样......

$ echo '#!/bin/bash' > thing.sh
$ cat thing.sh
#!/bin/bash

答案 3 :(得分:0)

使用“\”,如:

echo \#\!/whatever > test

答案 4 :(得分:-1)

有两个原因:

一,双引号和单引号字符串之间的行为差​​异。

"#!/bin/bash\n/usr/local/bin/tor"被“扩展” - 也就是说,此处引号内的命令将首先执行。

因此,
 echo "$(echo foo)" > file将'foo'放入file,而
 echo '$(echo foo)' > file提出 file中的'$(echo foo)'。

“#!”是一个注释,这在其他shell中不会发生。如果它开始一个文件(作为一个shebang),POSIX指定这是未定义的行为;但是没有理由在这里发生这种情况。