当我输入echo $0
时,我看到-
我希望看到bash或某些文件名,如果我得到"-"
,这意味着什么?
答案 0 :(得分:6)
$0
前面的连字符表示此程序是登录shell。
注意:$0
并不总是包含正在运行的可执行文件的准确路径,因为有一种方法可以在调用execve(2)
时覆盖它。
答案 1 :(得分:1)
几周前,我得到'-bash',我在修改流程名称时可以看到,当您运行ps
或top/htop
或echo $0
时。要直接回答你的问题,我认为这并不意味着什么。 Echo是bash的内置函数,所以当它检查参数列表时,bash实际上正在进行检查,并在那里看到自己。
你的直觉是正确的,如果你在脚本文件中写了echo $0
并运行它,你会看到脚本的文件名。
答案 2 :(得分:1)
因此,基于您的一条评论,您真的想知道如何确定您正在运行的shell;您认为$0
是解决方案,并询问了这一点,但正如您所见,$0
无法可靠地告诉您需要了解的内容。
如果你正在运行bash,那么将设置几个未导出的变量,包括$BASH_VERSION
。如果您正在运行tcsh,那么将设置shell变量$tcsh
和$version
。 (请注意,$version
是一个过于通用的名称;我遇到了一些问题,其中一些系统范围的启动脚本设置它并破坏特定于tcsh的变量。但$tcsh
应该是可靠的。)
但真正的问题是,bash和tcsh语法大多不兼容。有可能编写一个脚本,可以在从tcsh或bash调用时(通过.
或source
)执行,但这将是困难和丑陋的。
通常的方法是使用单独的安装文件,每个shell使用一个。例如,如果您正在运行bash,则可以运行
. ~/setup.bash
或
. ~/setup.sh
如果您正在运行tcsh,则可以运行
source ~/setup.tcsh
或
source ~/setup.csh
.sh
或.csh
版本是指两个炮弹的祖先;如果您没有使用任何特定于bash或特定于tcsh的功能,那么使用这些后缀是有意义的。
但这需要知道你正在运行哪个shell。
您可以在.cshrc
,.tcshrc, or
。登录, and an alias or function in your
。个人资料,
。bash_profile , or
。bashrc`中设置别名无论你需要哪个剧本。
或者,如果您想在每次登录时进行设置,或者每次启动新的交互式shell时,都可以将命令直接放在相应的shell启动文件中。当然,tcsh
与bash
的命令会有所不同。