如何在fish shell脚本中获取程序名称?

11
在Bash中,就像在Ruby中一样,程序名称由$0给出。那么在Fish中呢?如果必须的话,我可以这样做:
set PROGRAM (ps --no-header -o args -p %self | egrep -o '\S+')[2]

但我相信程序名称一定已经在某个地方可用。我也可以在每个程序的桩代码中将程序名称设置为变量,但这会带来维护问题。

4个回答

18

要获得与您的命令相同的结果,您需要查找的是脚本文件名。

此信息未存储在变量中,但您可以通过查询status来获取此信息。

basename (status -f)      # The name of the file
status -f                 # The full path of the file

更多信息: http://fishshell.com/docs/2.0/commands.html#status


1
如果程序名称与正在执行的文件不同,则此方法无法正常工作。例如,如果命令是在config.fish中定义的函数或符号链接文件。 - Thayne
请尽量不要在您的 config.fish 中定义函数,而是将您的 functionName.fish 文件保存到 $fish_function_path 中的某个位置,并让 fish 在第一次使用时懒加载该函数。 - Jorge Bucaran
status -f 给我文件名,而不是完整路径。 - Marco Sulla

5

4

对于 fish,使用 $_ 作为程序名称。


1
谢谢。我使用 $_ 没有任何结果。在 link 中有一个关于 $_ 的简短参考。还有在 link 中。它与窗口标题有关,但不是实际的程序名称。 - user1494787
1
交互地说,它是当前命令的名称,例如对于echo $_,它返回echo。在函数中,它仍然是您键入的顶级交互式命令(例如function f; g; end; function g; echo $_; end,然后键入f,它将打印f)。在非交互式脚本中,它似乎为空。无论如何,这不是你想要的。 - Beni Cherniavsky-Paskin
2
这些特殊变量名称的清单在哪里可以找到?(另一个是 $argv。)它们很难通过 Google 查找... - mjs
在fish 3.0.0中,$_已被弃用,建议使用status current-command代替。详情请见https://github.com/fish-shell/fish-shell/blob/master/CHANGELOG.md#deprecations-1。 - Édouard Lopez

1
文档 中可以看到,从版本3.4.1开始,您可以简单地使用以下命令:
echo (status basename)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接