我有一个简单的脚本 test.sh
#!/bin/bash
echo $0
当我从csh终端运行以下内容时:
bash -c 'test.sh'
然后输出test.sh
但是当我运行时:
bash -c 'source test.sh'
输出为bash
在这种情况下,有人知道如何打印脚本名称吗?
#!/bin/bash
declare -r SCRIPT_NAME=$(readlink -f ${BASH_SOURCE[0]})
使用 $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
当脚本使用源代码运行时,它在现有 shell 中运行,脚本创建或修改的任何变量在脚本完成后将保持可用。相反,如果脚本仅作为文件名运行,则将生成一个单独的子shell(具有一组完全独立的变量)来运行脚本。
您还想修改外壳脚本
这不能工作,原因与不能使用子外壳修改父外壳的环境相同。子进程的环境是私有的,不能影响其父进程的环境。
完成您正在尝试的操作的唯一方法可能是让 comped 编写一个包含 shell 变量赋值列表的标准输出流。然后,标准输出可以用作父"源"或"."命令的输入。使用诸如make之类的"嘈杂"程序将非常具有挑战性。
如果您尝试从 csh 访问 bash shell 脚本中定义的会话变量,则必须在启动 csh 之前调用 bash 脚本。
会话被继承到子进程中,就像这样,其中 csh。会话和 CSH。一旦 csh"启动",SESSION_INHERITED就会合并:
bash/
├── csh
│ ├── SESSION
│ └── SESSION_INHERITED
└── SESSION
砰砰砰。无法从 csh shell 内部访问 SESSION,因为这会将init
运行级别暴露给任何子进程。它是一个fork
,在生成时复制环境。
所以,你可以从 bash:source test.sh; csh
.这会将 test.sh 的导出公开到 csh - 但它是一个静态导出,无法在 csh 中以编程方式修改。
没有100%理解你的问题,因为它非常抽象..但希望这对:)有所帮助
使用 source 或 . 时,在此命令行管理程序中运行脚本。脚本与命令行管理程序共享变量,包括 $0。运行命令行管理程序时,您键入了"bash",因此 $0 是 bash,脚本使用它。这就是为什么它显示 bash强文本。如果您想要一个新的 $0,请使用"./script_name.sh"代替!