linux - 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 或某事中是否存在错误?有没有办法解决它?
解决方案
在 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
推荐阅读
- javascript - 将 JavaScript 导入 React
- python-3.x - 从 Txt 文件 Python 运行 SQL 查询
- qt - 如何使用 TAB 和 SHIFT+TAB 在 macOS 中的自定义 QML 控件上循环 activeFocus?
- django - 如何在将 aws elastic beanstalk 用于 django 应用程序时使用 nginx 设置 gunicorn
- sql-server - 在 SQL Server 中,可以在 case 语句中的“THEN”之后有多个语句吗?
- python - 用于单击按钮的 Webscraping 代码停止工作
- assembly - arm-none-eabi-ld -Ttext=0x20 -o add.elf add.o有什么用
- session-state - 我作为客户和管理员的会话搞砸了
- python - 使用 mlflow 拟合和预测模型
- elasticsearch - Elasticsearch 何时确认文档的索引?