如果我要执行未设置执行许可的bash脚本,则可以执行以下操作:
bash script.sh
bash
如果脚本不可执行并且我不知道正确的解释器,我应该使用什么代替?是否存在从shebang行查找解释器并执行脚本的命令?
bash whatever
可行,为什么还要使用其他方法?bash实际上在每个* ix系统上都可用,所以为什么要打扰...
如果我要执行未设置执行许可的bash脚本,则可以执行以下操作:
bash script.sh
bash
如果脚本不可执行并且我不知道正确的解释器,我应该使用什么代替?是否存在从shebang行查找解释器并执行脚本的命令?
bash whatever
可行,为什么还要使用其他方法?bash实际上在每个* ix系统上都可用,所以为什么要打扰...
Answers:
是的 它叫做perl
:
perl foo.bash # works
perl foo.lua # works
perl foo.clisp # works
perl foo.csh # works
perl foo.php # works
perl foo.gnuplot # works (no arguments)
perl foo.pl # works (obviously)
perl foo.py # works
perl foo.sh # works
perl foo.tcl # works
perl foo.rb # works
perl foo.nodejs # works
perl foo.r # works
perl foo.oct # works
perl foo.csharp # works (no arguments)
Perl的文档中提到了这一点:
如果该
#!
行既不包含单词“ perl”也不包含单词“ indir”,则将执行以命名的程序,#!
而不是Perl解释器。这有点奇怪,但是它可以帮助那些不这样做的人#!
,因为他们可以告诉程序其SHELL是/ usr / bin / perl,然后Perl会将程序分派给正确的解释器。
.js
也可以吗?
#!
。我现在似乎更多了,还没有遇到这个问题。
man perlrun
令人毛骨悚然地承认它“有点奇怪” :)。我认为这应视为针对非UNIX环境和非常老版本的UNIX 的好奇心。
如果脚本是从解释器中运行,你不能确保它具有家当都。脚本,从解释器中运行不需要家当,如果你调用解释器来运行代码。
因此,答案是否定的,没有命令可以确定使用哪种语言(解释器)来运行脚本。但是,您始终可以查看脚本的内部,看看是否有需要查找的脚本。
简要的规则:
但是,如果脚本没有shebang,则脚本内没有(直接*)信息来告诉要使用的解释器。
您当然可以总是编写包装器脚本,以尝试找出该脚本是否具有shebang并从中读取解释器,然后从找到的解释器中运行它。
一个例子
#!/usr/bin/env python3
import subprocess
import sys
args = sys.argv[1:]; script = args[0]
try:
lang = open(script).readlines()[0].replace("#!", "").strip().split()[-1]
cmd = [lang, script]+args[1:]
subprocess.call(cmd)
except (PermissionError, FileNotFoundError, IndexError):
print("No valid shebang found")
它另存为tryrun
中$PATH
(例如~/bin
,使目录,如果它不存在,注销并重新登录的),使其可执行。然后运行:
tryrun /path/to/nonexecutablescript
在我的非可执行文件python
和bash
脚本上调用(测试)正确的解释器。
#!
然后使用其余的来调用解释器。PermissionError
或a FileNotFoundError
。扩展(.sh
,.py
等等)凡在确定Linux上的适当的解释没有任何作用。
(*当然可以开发一种“智能”猜测算法来从代码中确定语法。)
您可以使用如下脚本来实现:
#!/bin/bash
copy=/tmp/runner.$$
cp $1 ${copy}
chmod u+x ${copy}
${copy}
rm ${copy}
从而:
$ echo "echo hello" > myscript
$ ./myscript
bash: ./myscript: Permission denied
$ ./runscript myscript
hello
我建议不要这样做。许可存在是有原因的。这是一个用于破坏权限的程序。
请注意,shebang处理是一个内核函数(在Linux源代码-中fs/binfmt_script.c
)。从根本上讲,直接调用脚本的过程并不了解#!
-内核使用它来确定需要启动解释器。