【问题标题】:How to get shellscript filename without $0?如何在没有 $0 的情况下获取 shellscript 文件名?
【发布时间】:2018-01-30 07:52:49
【问题描述】:

我尝试在 shellscript 上使用 python 练习if __name__ == "__main__":

示例脚本如下:

a.sh:

#!/bin/bash

filename="a.sh"

function main() {
  echo "start from $0"
  echo "a.sh is called"
  source b.sh
  bfunc
}

[[ "$0" == "${filename}" ]] && main

b.sh:

#!/bin/bash

filename="b.sh"

function main() {
  echo "start from $0"
  echo "b.sh is called"
}

function bfunc() {
  echo "hello bfunc"
}

[[ "$0" == "${filename}" ]] && main

您可以使用bash a.sh 调用它。

如果你打电话给bash a.sh,你会得到如下信息:

start from a.sh
a.sh is called
hello bfunc

这是我的问题。 如何在不使用$0 的情况下获取文件名本身? 我不想直接写文件名,即我想将文件名值传递给${filename}

不知道是上面python实践的看链接:What does if __name__ == "__main__": do?

如何检查b.sh 是从命令行启动还是通过包含从a.sh 执行?

【问题讨论】:

  • 旁注:function 关键字在 bash 脚本中是多余的,而且它会使您的脚本无缘无故地与 POSIX 不兼容。我会删除它。
  • 我认为,$0 是最简单的方法。为什么你不喜欢它?
  • @ViktorKhilin: $0 指的是正在执行的程序,但他想指的是当前文件。如果当前文件包含在另一个脚本中,$0 将给出错误的结果。
  • @ViktorKhilin,最简单,但不可靠。见BashFAQ #28

标签: python bash shell


【解决方案1】:

您可以使用变量$BASH_SOURCE 来获取当前脚本文件的名称。

if [[ "$0" == "$BASH_SOURCE" ]]
then
    : "Execute only if started from current script"
else
    : "Execute when included in another script"
fi

【讨论】:

  • 你在这里遗漏了一些语法;如给定的那样,这将尝试使用第一个参数== 运行 $0(可能递归!)。必须是[[ "$0" == "$BASH_SOURCE" ]][ "$0" = "$BASH_SOURCE" ]
  • 注意[ 的情况下只有一个= -- 这是因为POSIX test specification 只指定= 作为字符串比较运算符; == 是一个不可移植的扩展...虽然如果您使用的是 [[,那么您的代码无论如何都是不可移植的,所以这不是一个问题。
  • (另外,仅包含注释的 ifelse 块不是有效的语法;您需要 some 命令,即使它是 true 或它的同义词:)。
  • @CharlesDuffy:谢谢,你说得对,Python 太多了。我只会在需要时写一个 else 块。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-02-11
  • 2013-08-26
  • 1970-01-01
  • 2013-05-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多