我有一个小的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?)?有更好的方法吗?
答案 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指定这是未定义的行为;但是没有理由在这里发生这种情况。