如何确定脚本本身中的Bash脚本文件的名称?
就像如果我的脚本在文件runme.sh中,那么我如何让它显示“您正在运行runme.sh”消息而不硬编码?
如何确定脚本本身中的Bash脚本文件的名称?
就像如果我的脚本在文件runme.sh中,那么我如何让它显示“您正在运行runme.sh”消息而不硬编码?
当前回答
this="$(dirname "$(realpath "$BASH_SOURCE")")"
这将解析符号链接(realpath会这样做),处理空格(双引号会这样做),并将找到当前脚本名称,即使是在来源(. ./myscript)或被其他脚本调用时($BASH_SOURCE会这样做)。在所有这些之后,最好将其保存在环境变量中以便重用或方便复制到其他地方(this=)…
其他回答
如果不带路径,可以使用${0##*/}
me=`basename "$0"`
对于读取symlink1,这通常不是你想要的(你通常不想以这种方式迷惑用户),尝试:
me="$(basename "$(test -L "$0" && readlink "$0" || echo "$0")")"
在我看来,这会产生令人困惑的输出。“我跑了foo.sh,但它说我跑了bar.sh!?”一定是虫子!”此外,使用不同名称的符号链接的目的之一是根据其名称提供不同的功能(例如某些平台上的gzip和gunzip)。
1也就是说,为了解析符号链接,当用户执行foo.sh时,它实际上是一个到bar.sh的符号链接,你希望使用解析的名称bar.sh而不是foo.sh。
$0将给出您正在运行的脚本的名称。创建一个脚本文件并添加以下代码
#!/bin/bash
echo "Name of the file is $0"
然后像这样从终端运行
./file_name.sh
回显“您正在运行$0”
echo "$(basename "`test -L ${BASH_SOURCE[0]} \
&& readlink ${BASH_SOURCE[0]} \
|| echo ${BASH_SOURCE[0]}`")"