我是 Linux 新手,对命令行参数有一些疑问:
假设有一个名为 的命令行工具,widget
它接受一个名为 的参数fizz
。我见过各种不同类型的参数:
widget -fizz
widget --fizz
widget \fizz
widget -f
这些用法有什么不同?命令行工具是否决定如何以不同的方式确定它们,或者 Linux 是否知道它们都意味着同一件事,但以不同的方式将它们提供给应用程序?
我可以定制自己的方式向(已经存在的)widget
工具传递其fizz
参数吗:
widget #f#
提前致谢!
答案1
它们的使用方式有何不同?
这完全取决于程序,因为......
命令行工具是否决定如何以不同的方式确定它们,或者 Linux 是否知道它们都意味着同一件事,但以不同的方式将它们提供给应用程序?
...该过程的参数以单独字符串数组的形式出现。
这里涉及两件事:一是 shell,它解析您输入的输入并执行该过程。例如,它会根据空格拆分字符串并将其传递给widget
。例如,请参阅man sh
和man bash
以了解它们如何处理这些事情的详细信息。
但最终,它widget
会获取参数-fizz
,或者--fizz
准确地说是字符串。它会决定如何处理它。
有一些标准——getopts
和的许多变体popt
处理这些参数widget
,并且它们具有一定程度的“标准”行为。
然而没有什么可以阻止作者widget
发明自己的标准。
所以,最后,如果你是源代码的作者widget
或者修改了源代码,你绝对可以让它被视为#f#
参数fizz
。但是,如果不修改程序,你就无法做到这一点。
答案2
命令行工具是否决定如何以不同的方式确定它们,或者 Linux 是否知道它们都意味着同一件事,但以不同的方式将它们提供给应用程序?
可执行文件或函数的工作是评估其参数。shell(不是 Linux,而是bash
、csh
等)根本不会干扰这些参数。
这意味着每个参数都会根据你的情况被区别对待。但是请注意,shell 执行扩展或者替代在命令获取其参数之前。例如,当您有一个包含两个 JPG 图像的文件夹时,请输入:
ls *.jpg
然后 shell 将扩展*.jpg
为image1.jpg image2.jpg
,从而ls
传递以下参数:
ls image1.jpg image2.jpg
除此之外,除了重写源代码之外,您实际上无法修改脚本以采用除已编译或写入可执行文件的参数之外的其他参数。
另请查看以下问题:
答案3
首先,您不太可能在 Linux 中看到以 开头的任何参数,因为在大多数 shell 中,\
这是一个转义字符,用于转义空格和其他对 shell 有意义的字符($
,,,等等)。""
()
Linux shell(大多数发行版中为 Bash)只是将每个空格分隔的参数作为字符串传递给进程。进程决定如何处理这些参数是程序员的选择。
通常-
前缀表示短选项(例如-h
),而--
表示长版本(例如--help
)。这是大多数 Linux 程序使用的 POSIX 标准的一部分,该标准继承自早期的 Unix 工具。请参阅获取选项有关更多信息,请参阅维基百科上的文章。
对于您的最后一个问题,不,您不能修改该widget
工具解释这些参数的方式,除非您修改其源代码。
在某些 Unix 系统上,有一个名为帕格斯可以查看传递给该进程的所有参数。在 Linux 中,您可以使用以下方法复制此操作
ps eww -p 12345
其中 12345 是进程标识符 (PID)。请参阅这个答案寻找替代方案。