linux - linux 下的 shebang 不拆分参数

标签 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 中是否存在错误或某事?有办法解决吗?

最佳答案

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

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

将传递一个选项“-a -b -c”到/bin/foo,加上文件的内容。就像你打电话一样:

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

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

很难为此找到合适的文档,我能很快找到的最好的文档是:https://www.in-ulm.de/~mascheck/various/shebang/#splitting


作为解决方法,您通常会创建一个 shell 包装器:

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

关于linux - linux 下的 shebang 不拆分参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54843510/

相关文章:

bash - 使用 bash printf 包装列的正确方法

bash - 运行具有多个并行动态程序的 Shell 脚本

Linux shell 脚本未使用 bash -c "$com"设置变量

mysql - 如何检查MySQL中的列是否存在?

linux - 为什么ld需要/lib/x86_64-linux-gnu/ld-linux-x86-64.so.2,而它的默认动态链接器是/lib64/ld-linux-x86-64.so.2?

android - 如何区分运行在Android和传统Linux上的ELF文件?

bash - 在 heredocs 中着色,bash

php - CakePHP中的Cron Jobs突然停止了

regex - sed 替换文件名以引号开头

linux - linux 和 nginx 更新后 php 不工作