我想在shebang中使用一个程序,所以我创建了一个名为的脚本:
#!<mypgm>我还希望能够直接从命令提示符运行。
<mypgm> args...到目前为止没有问题。
我希望能够从带有参数的命令提示符中运行。
<myscript> blabla反过来,使用以下参数调用:
<mypgm> <myscript> blabla现在,我需要知道 blabla是什么时候使用shebang调用的,或者不使用:
myscript blabla # uses the shebang
-or-
<mypgm> myscript blabla # directly in the command prompt.我查看了环境变量(编辑:<===错误断言(进程表))、进程表(父进程),但是没有找到任何方法来改变。
到目前为止我唯一发现的是:
grep nonvoluntary_ctxt_switches /proc/$/status当这一行就在“谢邦”之后时,当通过“直接调用”时,该值通常为2(有时为3),而对于直接调用,则为1(有时为2)。由于不稳定和依赖于进程调度(进程从CPU中取出的次数),我想知道这里是否有人有更好的解决方案。
发布于 2019-05-06 17:36:36
真正的问题在于您设计<mypgm>命令行语法的方式。与其试图支持两种解释其论点的方法,不如提供两种方法来调用它。
Shebang命令是用来执行脚本内容的脚本引擎;它可能是bash、perl或其他类型的命令,但它的调用带有要执行的脚本的文件名。bash是如何做到的?这不是猜测。如果遇到任何不像选项(或选项的参数)的参数,则将其视为要执行的脚本;之后的参数将传递给脚本。例如:
/bin/bash -x -e somename foo bar在这里,bash将查找文件somename,并尝试将其作为带有参数foo和bar的脚本运行。您应该做同样的事情,因为有一天您可能希望在命令行上编写<mypgm> <myscript>。
如果您希望脚本少使用<mypgm>是默认的,则可以要求将脚本与<mypgm> -f <myscript>一起传递。sed就是这样做的。然后你就会把它用在像这样的线上:
#!<mypgm> -f如果您希望脚本大小写是默认的,就像bash和perl一样,创建一个选项,上面写着“这次没有脚本”。为此,您可以使用--,这样<mypgm> -- one two three就不会尝试将one (或其他任何东西)作为脚本运行。在这种情况下,谢邦一行将只读到:
#!<mypgm>发布于 2019-05-07 01:32:20
您可以使用常规的calc程序,比如calc PI + 3 (并作为扩展calc -f script_file_name)。
对于使用在雪邦创建链接(只有硬链接工作,如果我记得正确)命名的。calcf,然后在calc程序中检查可执行名称(对于C/C++,请查看函数main中的argv[0] )。您现在有了脚本中的#! /some/path/calcf。
这样,您就可以避免在命令行中使用-c之类的选项(保存了3次击键),而且也不需要在shebang中使用选项(这在Scott的注释不管是不是她的中可能存在问题)。
https://unix.stackexchange.com/questions/517370
复制相似问题