我有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或某处是否有错误?有办法解决吗?
答案 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