我在Ubuntu上使用Ctrl+ Alt+ T和其他终端打开了一个终端,方法是转到目录,然后右键单击并选择“在终端中打开”。
echo $0
在这两种情况下,我都做了一个。
在第一种情况下:
$ echo $0
-bash
在第二种情况下:
$ echo $0
/bin/bash
为什么会有这种差异?
我在Ubuntu上使用Ctrl+ Alt+ T和其他终端打开了一个终端,方法是转到目录,然后右键单击并选择“在终端中打开”。
echo $0
在这两种情况下,我都做了一个。
在第一种情况下:
$ echo $0
-bash
在第二种情况下:
$ echo $0
/bin/bash
为什么会有这种差异?
Answers:
如果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
我的终端(始终处于同一终端)中发生的情况:
登录时会启动外壳程序,但是它也会由诸如之类的程序启动make
,或者当您运行外壳程序脚本时,或者当您键入:sh
时vi
,或者在创建新的终端窗口时,外壳程序也会启动。
最初,shell在~/.profile
您登录或运行时读入su
。该脚本将执行一些操作,例如宣布您是否有新电子邮件,自定义擦除和杀死字符以及设置和导出TERM和PATH变量。在几乎任何其他上下文中启动时,shell都不会读取~/.profile
,因为执行这些操作中的大多数都是多余的。您应该将任何重要的Shell变量都导出到新的Shell中。
Shell知道是否可以读入的方式~/.profile
是检查argv[0]
aka 的第一个字符是否$0
为'-'
。
从开始csh
,引入了别名。别名未在环境中导出。csh
设计用于读取两个不同的初始化脚本。~/.login
仅在用户登录时才被读取,并且提示以argv[0]
开头'-'
。~/.cshrc
每次启动外壳程序时都会读取。通常,在中放置别名,在中放置~/.cshrc
其他内容~/.login
。csh
还支持~/.logout
,在大多数情况下只需清除屏幕即可运行fortune
。
其他外壳采用了这些相同的功能。ksh
会读入~/.kshrc
,bash
会读入~/.bashrc
,这些就是您要放置别名定义的地方。
因此,总而言之,产生外壳程序的应用程序将决定它应该是“登录外壳程序”,在这种情况下,应该是'-'
开始时的外壳程序或常规外壳程序。在大多数情况下,将要交互的外壳程序作为登录外壳程序启动,并且该外壳程序仅用于运行某些命令(无论是作为参数还是来自脚本),然后退出的是常规外壳程序。
但这完全取决于启动外壳的应用程序的兴致。