我有一个列出数据库文件的程序。
它从 shell 中被直接称为
db filename
列出整个文件,或喜欢
db 'filename :: conditions'
仅列出选定的元素...
另一种方法是使用包含所有参数的文件来调用它。
db < parameterfile
内容是这样的(和上面''中的内容差不多):
filename
::
conditions
现在我想让这样的文件可执行。这样我就可以打电话了./parameterfile
。
我认为使用 shebang#!/usr/bin/env db
失败,因为#
不是评论标志。我收到错误消息
db - Line 1 near ""#.//r" - " - syntax error
shell returned 26
有没有单行线可以做到这一点?
只需将其设为 shell 脚本即可。要么是这样的:
(取决于外壳,要么将此处文档的内容放入一个临时文件中,该文件将成为将在执行
db
之前运行和删除的进程的标准输入db
,或者是一个带有外壳进程的管道,通过它提供数据)。或者:
tail
这里在和之间有一个管道(或者可能是带有 ksh93 的套接字对)db
。或者:
这里
db
直接在脚本上打开 's stdin,第一行用 . 跳过read
。那将是最有效的。您可以编写一个 shell 脚本来删除 shebang 行(如果有),并将结果传递给
db
. 将此脚本放在您的PATH
. 否则,您可能必须在 shebang 行中指定脚本的完整路径。使用此脚本作为您的parameterfile
.runparam
如果第一行是 shebang 行,则删除第一行的示例脚本:示例
parameterfile
:你可以运行它
在这种情况下,脚本可以假设总会有一个 shebang 行。
您也可以使用与调用相同的方式直接使用参数文件调用脚本
db
,但这没有任何优势。如果您永远不会
runparam
使用不包含 shebang 行的文件进行调用,则可以使用tail
而不是awk
无条件地删除第一行。这可能会更快。使用 awk 作为 shebang 包装器:
如果您的脚本不应该直接通过
execve(2)
但只能通过 shell(或通过类似的命令find -exec
)运行,那么您有更多选择,包括使其可执行而不预先添加 shebang,并将其保留为任何语言的有效命令脚本该db
命令理解。这完全取决于该语言是什么。例如,如果该语言中的注释行以//
(如在 C++ 中)开头,则可以使用: