从函数内部获取 shell 脚本的名称

从函数内部获取 shell 脚本的名称

说我有这个:

#!/bin/sh
function show_help {
  cat<<%
Usage: $0 [-h]
%
}
# the following lines is pseudo-code
if argument contains "-h"
  show_help
otherwise
  do_stuff

如果我运行./test它会按预期执行一些操作,但是如果我运行./test -h,它会产生

Usage: show_help [-h]

但我打算让它产生

Usage: ./test [-h]

那么如何通过仅修改show_help函数来实现这一点呢?我不想修改脚本本身,所以我不会只SCRIPT_NAME=$0在 shebang 行下添加。
我希望解决方案是某种内置变量,如$PWD或函数pwd,真的存在吗?

答案1

我无法重现这个。该问题标有“/bash”。

对于 bash,$0 始终是脚本的名称,因此如果它位于 /tmp/test 中

#!/bin/bash
function show_help {
cat <<%
Usage: $0 [-h]
%
}
show_help

然后bash /tmp/test给我Usage: /tmp/test [-h]

如果我使用ksh93 /tmp/test我确实 get Usage: show_help [-h],因为当您以非 POSIX 方式声明函数时 ksh 设置 $0 。

切换到可移植函数声明

#!/bin/bash
show_help() {
cat <<%
Usage: $0 [-h]
%
}
show_help

你可以Usage: /tmp/test [-h]从 ksh 和 bash 中获得。

所以原来的脚本有很多错误。应该#!/bin/sh是如果问题是关于bash的,函数声明不正确,并且最后的#!/bin/bash语法是错误的。if

答案2

在 BASH 中,使用 $FUNCNAME[1]。 $FUNCNAME[0] 是 show_help。您还可以获得调用 show_help 的父函数中的行号以及源文件的名称($BASH_LINENO[1]、$BASH_SOURCE[1])。

我正在寻找 korn shell (ksh) 的类似答案

答案3

因为这个问题看起来像是家庭作业问题。所以我不是以准确的方式回答,而是给出一些提示。

  1. 获取正在运行的进程的父PIDgrep PPid /proc/self/status | awk '{print $2}
  2. 找出它的可执行文件名称ls /proc/<PPid>/exe
  3. 使用readlink打印出上面软链接的名称readlink /proc/<PPid>/exe

输出3是运行脚本的名称。

相关内容