说我有这个:
#!/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
因为这个问题看起来像是家庭作业问题。所以我不是以准确的方式回答,而是给出一些提示。
- 获取正在运行的进程的父PID
grep PPid /proc/self/status | awk '{print $2}
- 找出它的可执行文件名称
ls /proc/<PPid>/exe
- 使用readlink打印出上面软链接的名称
readlink /proc/<PPid>/exe
输出3是运行脚本的名称。