【Ubuntu 笔记】翻译3.4 Login Shells,Interactive Shells
一、前言
不多说还是Shell启动的学习,看外文的比中文的过瘾。虽然不能说很有目的性得在都,但是正是由于不了解,所以才想相关的都看一遍。
区分登陆和非登陆
认真读一篇,好过千篇一律的100遍。
二、原文
http://docstore.mik.ua/orelly/unix3/upt/ch03_04.htm
三、译文
Login Shells, Interactive Shells
每个Unix Shell(sh,csh,etc.)都可以分为交互式和非交互式.一个Shell 程序也可分为登陆和非登陆。A shell is a shell is a shell--e.g.,一个登陆的bash shell 和未登录的bash shell是同样的程序。不同的是shell实现的方式:读取了哪些启动文件,是否设定了一些shell命令等等。
- Login Shell
第一次从终端登陆到Unix系统时,系统正常情况下会启动一个login shell。登陆shell一般处于init进程开启进程树的顶端shell。从这棵树下,很多进程的特定变量由父进程一层一层传递到子进程,特别是环境变量,比如搜索路径(search south).你在login shell中所做的改变会影响到顶层shell所开启的所有进程,包括后代进程。
所以,登陆login shell只在你第一次登陆时候用来构建全局环境——初始化终端,设置环境变量等等。shell程序能够辨别登陆式shell并为登陆式shell读取特定的setup文件。比如,登陆C shell会读取你的.login文件,而Bourne-type登陆shell会读取.profile。Bash可能还会读取/etc/profile,如果相应文件存在的话或者在启动文件里有没有限制profile文件的读取,他可能会读取~/.bash_profile或者~/.bash_login或者~/.profile。
未登录的shell要么就是子孙进程(从登陆进程开启的子孙进程),要么是图形界面开启的shell,再要么就是由at,rsh开启的”断开"shell,等等。这些shells不会读取/.login和/.profile。虽然,根据bash在调用的时候-norc,-rcfile作为参数是否通过,bash会允许未登录shell选择是否读取~/.bashrc。-norc禁止读取这些文件,-rcfile则允许子目录下的文件作为参数通过。
有些shell很容易被识别出到底是不是登陆式shell。比如,tcsh设定了参数loginsh。详细情况查看你的shell手册。4.12章节给出了另一个方案:利用在大多数shell中都设定了的SHLVL。或者你可以把下面几行代码添加到登陆shell读取的特定文件的开头(章节3.3)。这行代码设定了loginshell参数:
set loginsh=yes ...csh
loginshell=yes ...bash and other sh-type shells
如果你想查看你的shell类型,操作:
pass 标记,看不懂
由于这些变量只有在登陆式shell读取setup文件的时候才会被设定,因此上述操作才能奏效。注意:所有的上述变量都没有用关键字"export"声明,所以这些变量不能被子进程开启的shell读取,因此也就不能作为登陆式shell的标志符。
- Interactive Shell
总而言之,shells有两个用途。有时,shell来控制你在命令行下输入的命令。这就是交互式的shell.其他时候,shell从从文件中读取命令,也就是shell script(章节 35.2)。这种情况下,shell不需要打印出命令去进行命令编辑等等操作。这样的就可以被成为非交互式的shell。(没有明确的规定说只有非交互式的shell才能读取脚本,或者只有交互式的shell才能从终端读取命令。但是通常情况下,这种说法是成立的。)
交互式和非交互式的另一个区别就是,除非有特别规定,那交互式shell已经讲STDOUT(标准正确输出)和STDERROR(标准错误输出)都绑定到了终端。
要看你的shell是否是交互式的shell很简单。Cshell设定了变量prompt,而Korn shell和bash设定了 -i 标志符。使用$-variable可以显示你当前的标志符:
prompt$ echo $-
imH
从先前在交互式bash shell中的例子可以看出,交互式shell的符号(i),监控模式(m)的符号,历史代替(H)的符号都已经被设定了。
--JP and SJC