如何确定脚本本身中的Bash脚本文件的名称?
就像如果我的脚本在文件runme.sh中,那么我如何让它显示“您正在运行runme.sh”消息而不硬编码?
如何确定脚本本身中的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"
演职员:我综合了多个答案才得到这个答案。
其他回答
如果脚本名中有空格,更可靠的方法是使用"$0"或"$(basename "$0")"-或MacOS: "$(basename \"$0\")"。这可以防止名称以任何方式被破坏或解释。一般来说,在shell中始终使用双引号作为变量名是一种良好的实践。
您可以使用$0来确定您的脚本名称(带完整路径)-要获得只有您可以使用该变量的脚本名称
basename $0
如果你调用shell脚本喜欢
/home/mike/runme.sh
$0是全名
/home/mike/runme.sh
Basename $0将获得基本文件名
runme.sh
你需要把这个基本的名字放到一个变量里,比如
filename=$(basename $0)
并添加额外的文本
echo "You are running $filename"
你的脚本就像
/home/mike/runme.sh
#!/bin/bash
filename=$(basename $0)
echo "You are running $filename"
this="$(dirname "$(realpath "$BASH_SOURCE")")"
这将解析符号链接(realpath会这样做),处理空格(双引号会这样做),并将找到当前脚本名称,即使是在来源(. ./myscript)或被其他脚本调用时($BASH_SOURCE会这样做)。在所有这些之后,最好将其保存在环境变量中以便重用或方便复制到其他地方(this=)…
为了回答Chris Conway的问题,在Linux上(至少)你会这样做:
echo $(basename $(readlink -nf $0))
Readlink输出符号链接的值。如果不是符号链接,则打印文件名。-n告诉它不打印换行符。-f告诉它完全跟随链接(如果一个符号链接是到另一个链接的链接,它也会解析那个链接)。