Linux下的shebang不会拆分参数

时间:2019-02-23 16:19:11

标签: linux bash shell ubuntu gnu-coreutils

我有kotlin脚本(但是它可以是带有参数的任何Linux命令),例如:

#!/usr/bin/env kotlinc -script
println("hello world")

在Ubuntu中运行它会得到:

/usr/bin/env: ‘kotlinc -script’: No such file or directory

但是当我在命令行中运行时:

/usr/bin/env kotlinc -script

有效。查找路径没有问题,因为脚本:

#!/usr/bin/env kotlinc
println("hello world")

有效

出于某些原因,在Ubuntu "#!/usr/bin/env kotlinc -script"下,"kotlinc -script"被视为单个参数。但是只能在shell脚本头中。

我需要明确地运行脚本"#!/usr/bin/env kotlinc -script",因为我希望它可以在"kotlin"位于$PATH的其他发行版最终环境中正常运行。

Ubuntu coreutils或某处是否有错误?有办法解决吗?

2 个答案:

答案 0 :(得分:5)

在Linux上,通过shebang行不能传递多个参数。所有参数将作为单个字符串传递给可执行文件:

#!/bin/foo -a -b -c

会将一个选项“ -a -b -c”传递给/bin/foo,并加上文件的内容。就像您要致电:

/bin/foo '-a -b -c' contents-of-file.txt

如今,大多数Unix衍生产品的行为应相同,但可能有所不同,我尚未对它们进行全部测试:)

很难找到合适的文档,我很快就能找到最好的文档:documentation on URL dispatching [Django-doc]


作为解决方法,通常可以创建一个外壳包装程序:

#!/bin/bash
exec kotlin --arg1 --arg2 ... /path/to/kotlin-script

答案 1 :(得分:1)

检查您的coreutils版本:

apt-cache policy coreutils

从coreutils 8.30开始,您将可以使用:

#!/usr/bin/env -S command arg1 arg2 ...

您可能要升级coreutils