我该如何在脚本的 shebang 中允许多个参数传递给解释器

我该如何在脚本的 shebang 中允许多个参数传递给解释器

格伦的回复:

阅读你的execve(2)手册页。对单个可选参数的限制取决于操作系统。 Linux 将解释器之后的所有单词视为一个参数

如果你想这样做:

#! /path/to/interpreter arg1 arg2 arg3

事实上你应该这样做

#!/bin/sh
exec /path/to/interpreter arg1 arg2 arg3 "$@"

如果我想编写一个包含脚本语言中的一些代码的脚本:

#! /path/to/interpreter arg1 arg2 arg3

<script content in the script language>

根据格伦的回复,我应该将脚本写为:

#!/bin/sh
exec /path/to/interpreter arg1 arg2 arg3 "$@"

那我应该写在哪里呢<script content in the script langauge>?由于它是用脚本语言编写的而不是用shell语言编写的,所以它不能放在shell脚本中,对吗?我应该把它放在哪里?

谢谢。

答案1

除了muru给出的选项之外,还有一个选项。根据脚本的复杂性和长度,您可以将脚本放入 shell 脚本中(它是否普遍有用是另一个问题!)“此处文档”机制,您可以将 shell 管道嵌入文本到另一个程序中,如下所示:

测试文件

#!/bin/sh
exec /usr/bin/python3 <<EOF
import datetime
print("The time is now "+str(datetime.datetime.now()))
EOF

如果程序非常大,我不会使用它,因为编辑此类脚本比较困难;它们嵌入在另一种语言中,因此如果您想测试它们,则必须提取脚本以进行任何修改。

奇怪的是,请注意 shell 仍然使用此方法扩展 shell 变量并解释特殊字符:

#!/bin/sh
exec /usr/bin/python3 <<EOF
print("The current user is $USER and date is $(date).")
EOF

返回The user is erik and date is Fri Apr 6 22:14:23 MDT 2018

答案2

您必须欺骗解释器忽略该exec行,并将脚本内容正常放入文件中。选项包括:

相关内容