我有一个很小的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指定这是不确定的行为;但是没有理由在这里应该发生这种情况。