我有一个简单的脚本test.sh
#!/bin/bash
echo $0
当我从csh终端运行以下命令时:
bash -c 'test.sh'
然后输出为test.sh
但是当我跑步时:
bash -c 'source test.sh'
输出为bash
在这种情况下,有人知道如何打印脚本名称吗?
答案 0 :(得分:7)
#!/bin/bash
declare -r SCRIPT_NAME=$(readlink -f ${BASH_SOURCE[0]})
答案 1 :(得分:4)
使用$ BASH_SOURCE。从手册页:
BASH_SOURCE
An array variable whose members are the source filenames where
the corresponding shell function names in the FUNCNAME array
variable are defined. The shell function ${FUNCNAME[$i]} is
defined in the file ${BASH_SOURCE[$i]} and called from
${BASH_SOURCE[$i+1]}.
您可以简单地引用$ BASH_SOURCE而不是$ {BASH_SOURCE [0]},因为在没有索引的情况下在bash中取消引用数组变量将为您提供第一个元素。
这是我的脚本中的一种常见模式,允许采购与执行脚本不同的行为:
foo() {
some cool function
}
if [[ "$BASH_SOURCE" == "$0" ]]; then
# actually run it
foo "$@"
fi
答案 2 :(得分:3)
当使用源运行脚本时,它在现有shell中运行,脚本完成后,脚本创建或修改的任何变量都将保持可用。相反,如果脚本只是作为文件名运行,那么将生成一个单独的子shell(带有一组完全独立的变量)来运行脚本。
您还想修改shell脚本
由于您无法使用子shell修改父shell的环境,因此无法使用。子进程的环境是私有的,不会影响其父进程的环境。
完成您正在尝试的内容的唯一方法可能是编写包含shell变量赋值列表的标准输出流。然后,标准输出可以用作父源的输入。或'。'命令。使用'嘈杂'像make这样的程序将是非常具有挑战性的。
答案 3 :(得分:2)
如果从csh尝试访问bash shell脚本中定义的会话变量,则必须在启动csh之前调用bash脚本。
会话被继承到子进程中,就像这样,csh“引导”后csh.SESSION和csh.SESSION_INHERITED被合并:
bash/
├── csh
│ ├── SESSION
│ └── SESSION_INHERITED
└── SESSION
不能从csh shell中访问bash.SESSION,因为这会将init
运行级别公开给任何子进程。它是fork
,在spawn期间复制环境。
因此,您可以从bash运行:source test.sh; csh
。这会将test.sh的导出暴露给csh - 但它是一个静态导出,不能在csh中以编程方式修改。
没有100%理解你的问题,因为它非常抽象..但这有助于:)
答案 4 :(得分:0)
使用source或时。 ,您可以在此Shell中运行脚本。您的脚本与命令行管理程序共享变量,包括$ 0。运行命令行管理程序时,键入“ bash”,因此$ 0是 bash ,脚本会使用它。这就是为什么它显示bash strong text 的原因。 如果您想要一个新的$ 0,请改用'./script_name.sh'!