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



我有一个很小的bash脚本,该脚本应该移至我的主目录,制作文件,回荡一些垃圾,使其可执行。这就是它的样子:

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

但是,这一直在回声上打破,抱怨"找不到事件"吗?由于某种原因,我决定尝试此操作,然后奏效:

cd ; touch tor.sh; echo -e "x23x21/bin/bashn/usr/local/bin/tor" >> tor.sh; chmod +x tor.sh

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

这不是一个错误,它与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, !.

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

,例如

> 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?

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

echo '#!/bin/bashn/usr/local/bin/tor'

否则您可能会逃脱Shebang:

echo "#!/bin/bashn/usr/local/bin/tor"

使用" ",例如:

echo #!/whatever > test

尝试 ''s而不是像这样的 " s ...

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

两个原因:

一个,双重和单引号之间的行为差异。

"#!/bin/bashn/usr/local/bin/tor"是"扩展的" - 也就是说,引号中的命令将首先执行。

因此,
echo "$(echo foo)" > file将'foo'放在 file中,而
echo '$(echo foo)' > file putfile中的'$(Echo foo)'。

"#!"是评论,这在其他外壳中不会发生。如果它开始一个文件(作为Shebang),Posix指定这是不确定的行为;但是没有理由在这里应该发生这种情况。

相关内容

  • 没有找到相关文章

最新更新