$0 在我获取 bash 脚本时不起作用



我有一个简单的脚本 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"代替!

相关内容

  • 没有找到相关文章

最新更新