2019年6月25日 星期二

Unix中shell 和 eof 信号

我们之前解释过shell是读取Unix命令并解释命令的程序。当shell准备好读取命令时,它显示一个提示。在这个提示下,可以键入命令并按<Return>键。在按下<Return>之后,Unix中shell处理命令,然后显示一个新的提示。在一些情况下,命令可能启动一个程序,例如文本编辑器,您可能会使用这个程序一段时间。当结束程序时,您将返回到shell提示。
因此一般来说,提供CLI(命令行界面)的Unix会话由一条又一条命令的输入构成。
尽管看上去似乎神秘,但是它实际上只是一个程序。而且从shell的角度来看,键入的命令只是需要它处理的数据。因此,可以通过指示已经没有数据需要处理而停止shell。换句话说,就是可以通过按下^D(eof键)停止shell。
但是停止shell真正意味着什么呢?它意味着您已经结束了工作,而当shell停止时,Unix会自动将您注销。这就是为什么按下^D可以注销系统的原因。您实际上是在告诉shell(和Unix)已经没有工作需要做了。
这里还有一个问题。如果您不小心按下了^D会发生什么情况呢?您将被立即注销。解决办法就是告诉shell封闭eof信号。这一点如何做取决于您正在使用什么shell。接下来轮流说明shell的操作,具体包括Bash, C-Shell和Korn Shell,您可以使用自己特定的shell进行实验。

1. Bash: 封闭eof信号
Bash是Linux的默认shell。为了告诉Bash忽略eof信号,需要使用一个叫IGNOREEOF的环境变量。
IGNOREEOF被设置成一个特定的数字,用来指定在注销之前Bash会忽略特定行开头的^D多少次。在设置IGNOREEOF时,需要使用一个类似于下面的命令:

IGNOREEOF=5
为了测试这个命令,可以重复按^D,统计在注销之前按多少次^D
当设置了IGNOREEOF之后,如果按下^D,那么将会看到一个告诉你不能通过按^D进行注销的消息。如果使用的是登录shell(也就是在登录时自动启动shell),将会看到如下消息:(操作一下)

Use “logout” to leave the shell
如果使用的是一个子shell(也就是说一个在登陆后启动的shell),将会看到如下消息:

Use “exit” to leave the shell

如果基于某些原因,希望关闭IGNOREEOF特性,那么只需将它设置为0即可:

IGNOREEOF=0

显示IGNOREEOF的当前值,使用下述命令:

echo $IGNOREEOF
为了在每次登录时自动设置IGNOREEOF选项,需要在.profile文件中放置一条合适的set命令。

2. Korn Shell: 封闭eof信号
Korn Shell是多种商业Unix系统的默认shell。另外,FreeBSD的默认shell几乎完全与Korn Shell相同。
为了告诉Korn Shell忽略^D,需要设一个叫ignoreeof的shell选项。设置命令如下:

set --o ignoreeof

一旦设置了ignoreeof选项,如果按下^D,将看到一个告诉你不能通过按下^D进行注销的消息:

Use “exit” to leave the shell

如果基于某些原因,希望关闭ignoreeof选项,则可以使用下述命令:

set +o ignoreeof
显示ignoreeof的当前值,使用下述命令:

set --o
这将显示所有的shell选项,并说明它们打开的还是关闭的。
为了在每次登录时自动设置ignoreeof选项,需要在.profile文件中放置一条合适的set命令。

3. C-Shell: 封闭eof信号
为了告诉C-Shell忽略^D,需要设一个叫ignoreeof的shell变量。设置命令如下:

set ignoreeof

一旦设置了ignoreeof变量,如果按下^D,将看到一个告诉你不能通过按下^D进行注销的消息。如果使用的是登录shell(也就是在登录时自动启动shell),将会看到如下消息:

Use “logout” to logout

如果使用的是一个子shell(也就是说一个在登陆后启动的shell),将会看到如下消息:

Use “exit” to leave the csh

(csh是C-Shell程序的名称)
如果基于某些原因,希望关闭ignoreeof选项,则可以使用下述命令:

unset ignoreeof
显示ignoreeof的当前值,使用下述命令:

echo $ignoreeof

如果设置了ignoreeof,则看不到什么内容。如果没有设置ignoreeof,将看到:

ignoreeof: Undefined variable
为了在每次登录时自动设置ignoreeof变量,需要在.cshrc文件中放置一条合适的set命令。

沒有留言:

張貼留言