从格伦的回复:
阅读你的
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
行,并将脚本内容正常放入文件中。选项包括:
- 多语言脚本,其中
exec
命令的编写方式使其看起来像注释或字符串或类似于实际的解释器。例子: - 将脚本提供给解释器,并去掉初始行
- 使用 bash 和进程替换的示例
- GRUB 的
40_custom
,反之亦然:它采用带有 shebang 的脚本,然后不解释地打印它。