当我使用bash脚本时,$ 0不起作用

时间:2014-02-15 01:13:05

标签: bash csh

我有一个简单的脚本test.sh

#!/bin/bash
echo $0

当我从csh终端运行以下命令时:

bash -c 'test.sh'

然后输出为test.sh

但是当我跑步时:

bash -c 'source test.sh'

输出为bash

在这种情况下,有人知道如何打印脚本名称吗?

5 个答案:

答案 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'!