如何确定脚本本身中的Bash脚本文件的名称?

就像如果我的脚本在文件runme.sh中,那么我如何让它显示“您正在运行runme.sh”消息而不硬编码?


当前回答

这对./self.sh, ~/self.sh, source self.sh, source ~/self.sh很有效:

#!/usr/bin/env bash

self=$(readlink -f "${BASH_SOURCE[0]}")
basename=$(basename "$self")

echo "$self"
echo "$basename"

演职员:我综合了多个答案才得到这个答案。

其他回答

$BASH_SOURCE在获取脚本时给出正确答案。

然而,这包括路径,所以只获得脚本文件名,使用:

$(basename $BASH_SOURCE) 
DIRECTORY=$(cd `dirname $0` && pwd)

我从另一个堆栈溢出问题得到了上面,Bash脚本可以告诉它存储在什么目录中吗?,但我认为它对这个话题也很有用。

回复:上面Tanktalus(接受)的答案,一个稍微干净一点的方法是使用:

me=$(readlink --canonicalize --no-newline $0)

如果你的脚本来自另一个bash脚本,你可以使用:

me=$(readlink --canonicalize --no-newline $BASH_SOURCE)

我同意,如果您的目标是向用户提供反馈,那么取消对符号链接的引用可能会令人困惑,但在某些情况下,您确实需要获得脚本或其他文件的规范名称,在我看来,这是最好的方法。

this="$(dirname "$(realpath "$BASH_SOURCE")")"

这将解析符号链接(realpath会这样做),处理空格(双引号会这样做),并将找到当前脚本名称,即使是在来源(. ./myscript)或被其他脚本调用时($BASH_SOURCE会这样做)。在所有这些之后,最好将其保存在环境变量中以便重用或方便复制到其他地方(this=)…

简短,清晰,简单,在my_script.sh中

#!/bin/bash

running_file_name=$(basename "$0")

echo "You are running '$running_file_name' file."

把:

./my_script.sh
You are running 'my_script.sh' file.