首页 > 解决方案 > linux下shebang不拆分参数

问题描述

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

标签: linuxbashshellubuntugnu-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

推荐阅读