为什么“ echo $ 0”在两个不同的终端上给出不同的结果?


15

我在Ubuntu上使用Ctrl+ Alt+ T和其他终端打开了一个终端,方法是转到目录,然后右键单击并选择“在终端中打开”。

echo $0在这两种情况下,我都做了一个。

在第一种情况下:

$ echo $0
-bash

在第二种情况下:

$ echo $0
/bin/bash

为什么会有这种差异?


$ 0返回正在运行的进程的名称。
Ramesh 2014年

您是否以不同的用户身份运行两个终端?
cuonglm 2014年

我使用相同的用户
CodeBlue 2014年


它们实际上是不同的终端模拟器还是同一终端模拟器的两个实例?它们都是默认终端吗?
terdon

Answers:


16

如果echo $0命令的输出是,-bash则表示 bash已作为登录外壳程序调用。如果输出仅为bash,则您位于非登录外壳中。

man bash 在第126行的某处说:

A  login shell is one whose first character of argument zero is a -, or 
one started with the --login option.

在此处查看更多信息:登录Shell和非登录Shell之间的区别?

现在,要解释为什么您遇到/bin/bash第二种情况,我可以说一个程序(在您的情况下为文件管理器,可能是鹦鹉螺)或脚本可以将其自身更改$0为其他内容。作为示例,请查看$0我的终端(始终处于同一终端)中发生的情况:

在此处输入图片说明


12

区别在于这些方法的启动方式。bash的argv [0]将进行不同的初始化(读取不同的启动脚本)。如果字符串以连字符开头(-如中所示),-bash则它将作为登录外壳程序运行,否则,它将作为交互式外壳程序运行。它也可以作为非交互shell运行(即在shell脚本中)。

要了解更多信息,最好阅读手册man bash“ INVOCATION”部分。


9

登录时会启动外壳程序,但是它也会由诸如之类的程序启动make,或者当您运行外壳程序脚本时,或者当您键入:shvi,或者在创建新的终端窗口时,外壳程序也会启动。

最初,shell在~/.profile您登录或运行时读入su。该脚本将执行一些操作,例如宣布您是否有新电子邮件,自定义擦除和杀死字符以及设置和导出TERM和PATH变量。在几乎任何其他上下文中启动时,shell都不会读取~/.profile,因为执行这些操作中的大多数都是多余的。您应该将任何重要的Shell变量都导出到新的Shell中。

Shell知道是否可以读入的方式~/.profile是检查argv[0]aka 的第一个字符是否$0'-'

从开始csh,引入了别名。别名未在环境中导出。csh设计用于读取两个不同的初始化脚本。~/.login仅在用户登录时才被读取,并且提示以argv[0]开头'-'~/.cshrc每次启动外壳程序时都会读取。通常,在中放置别名,在中放置~/.cshrc其他内容~/.logincsh还支持~/.logout,在大多数情况下只需清除屏幕即可运行fortune

其他外壳采用了这些相同的功能。ksh会读入~/.kshrcbash会读入~/.bashrc,这些就是您要放置别名定义的地方。

因此,总而言之,产生外壳程序的应用程序将决定它应该是“登录外壳程序”,在这种情况下,应该是'-'开始时的外壳程序或常规外壳程序。在大多数情况下,将要交互的外壳程序作为登录外壳程序启动,并且该外壳程序仅用于运行某些命令(无论是作为参数还是来自脚本),然后退出的是常规外壳程序。

但这完全取决于启动外壳的应用程序的兴致。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.