关闭

2.5 创建shell环境

717人阅读 评论(0) 收藏 举报

2.5  创建shell环境

调优shell有助于更高效地工作。每次按Enter键时,提示符能够提供有关的信息。也可以通过设置别名来减少击键操作,并永久设置符合所需的环境变量。要使每项更改在启动shell时生效,可在shell配置文件中添加该信息。

2.5.1  配置shell

很多配置文件支持shell的工作方式。其中可以为所有用户和所有shell执行某些文件,而其他文件则只用于创建该配置文件的用户。表2-6显示了所有使用Linux bash shell的用户都感兴趣的文件。

表2-6                                                            Bash配置文件

文件

描述

/etc/profile

为所有用户设置用户环境信息。第一次登录时就执行该文件。该文件提供了路径的值,同时为某些内容设置环境变量,如邮箱的位置或历史文件的大小。最后,/etc/profile从/etc/profile.d目录中的配置文件收集shell设置

/etc/bashrc

每次打开bash shell时,会为每个运行bash shell的用户执行该文件。它设置默认提示符,可以添加一个或更多别名。可以用每个用户~/.bashrc文件中的信息改写该文件中的值

~/.bash_profile

每个用户使用它来输入针对他们自己使用的shell信息。用户登录时仅执行它一次。在默认情况下,它设置一些环境变量,并且执行用户的.bashrc文件

~/.bashrc

包含特定于bash shell的信息。在登录和每次打开一个新的bash shell时都会读取该文件。这是添加环境变量和别名的最好位置,这样shell就能够找到它们

~/.bash_logout

每次注销时执行(退出最后一个bash shell时)。在默认情况下,它只是清空屏幕

只有根用户才能改变/etc/profile或/etc/bashrc文件。用户可以更改其主目录中$HOME/.bash_profile、$HOME/.bashrc和$HOME/.bash_logout文件内的信息。

下面几节讲述在shell配置文件中添加内容的概念。在大部分情况下,可以将这些值添加到主目录的.bashrc文件中。但是如果管理一个系统,那么可能希望将某些值设置为所有Linux系统用户的默认值。

2.5.1.1  设置提示符

提示符由一组字符组成,在每次shell准备好接受命令时都会出现。PS1环境变量设置提示符包含什么。如果shell需要其他的输入,可使用PS2、PS3的PS4的值。

安装Linux系统后,通常设置好的提示符不仅仅是一个美元符号或者英镑符号。例如,在Red Hat的Linux系统中,提示符被设置成包括以下信息:用户名、主机名以及当前工作目录的基本名。这些信息括在中括号内,后跟一个美元符号(对于普通用户)或一个英镑符号(对于根用户)。下面是该提示符的例子:

[chris@myhost bin]$

如果改变了目录,那么bin名会变为新目录的名字。同样,如果以一个不同的用户登录,或者登录到不同的主机,那么该信息就会有所变化。

可以在提示符中使用很多特殊字符(在各种字母前添加反斜线来表示),从而在提示符中包括不同的信息。这些信息可以包括终端号、日期、时间和其他信息。表2-7提供了一些例子(可以在bash手册页中找到更多例子):

表2-7                                          可向bash提示符中添加信息的字符

特殊字符

描述

/!

显示当前命令的历史编号。这包括之前为该用户名储存的所有命令

/#

显示当前命令的命令编号。这只包括活动shell的命令

/$

显示用户提示符($)或根提示符(#),这取决于是什么用户

/W

只显示当前工作目录的基本名字。例如,如果当前工作目录是/var/spool/mail,那么该值为mail

/[

位于非打印字符序列之前。可以用来在提示符中添加终端控制序列,用于改变颜色、添加闪烁效果或加粗字符(终端决定了实际可用的序列)

/]

跟随一个非打印字符序列

//

显示反斜线

/d

显示当前日期的星期、月、天,例如:Sat Jan 23

/h

显示运行shell的计算机主机名

/n

生成一个新行

/nnn

显示与字符对应的八进制数,用来代替nnn

/s

显示当前的shell名。对于bash shell,它的值是bash

/t

显示当前时间,格式为小时、分钟和秒(如:10:14:39)

/u

显示当前用户名

/w

显示当前工作目录的完整路径

如果是通过在shell中输入而暂时设置提示符,则应该将PS1的值加在引号中。例如输入export PS1="[/t /w]/$ "后,可看到提示符是:[20:26:32 /var/spool]$。

如果要永久地更改提示符,则需要在主目录的.bashrc文件中添加PS1的值(假设正在使用bash shell)。在该文件中可能已经存在PS1的值,但是可以修改它。

2.5.1.2  添加环境变量

可以考虑在.bashrc文件中添加一些环境变量。这些变量有助于更高效地使用shell:

·    TMOUT:设置在bash自动退出前shell可以保持非活动状态的时间。该值是shell未接收输入的秒数。在您离开办公桌而同时仍登录到Linux的情况下,这是一个极佳的安全功能。只要在工作时不想让Linux退出,那么将该值设置为TMOUT=1800(允许30分钟空闲时间)就可以了。

·    PATH:如前所述,PATH变量设置在其中搜索所用命令的目录。如果经常使用不在PATH目录中的命令,就可以永久地添加它们。方法是,在.bashrc文件中添加PATH变量。例如,要添加/getstuff/bin目录,可以添加下列内容:

PATH=$PATH:/getstuff/bin ; export PATH

这个例子首先将所有的当前路径目录读入一个新的PATH($PATH),添加/getstuff/bin目录,然后导出新的PATH。

某些人通过添加一个由点(.)标识的目录就可将当前目录添加到PATH中,如下所示:

PATH=.:$PATH ; export PATH

这样就会始终运行当前目录中的命令(如果曾使用过DOS,可能会习惯这样做)。但是这个过程的安全风险在于,可能所处的目录包含并不希望从该目录运行的命令。例如:黑客可以将ls命令放入某个目录来做一些不光彩的事情,而不是列出目录的内容。

·    WHATEVER:可以创建自己的环境变量来加快工作速度。选择任何未使用的名字,然后为它分配一个有用的值。例如,如果很多工作都要用到/work/time/files/info/memos目录中的文件,则可以设置下列变量:

M=/work/time/files/info/memos ; export M

通过输入cd  $M就可以进入当前目录。通过输入$M/hotdog可以运行这个目录中称为hotdog的程序。还可以输入vi $M/bun来编辑此目录中的bun文件。

2.5.1.3  添加别名

与设置环境变量相比,设置别名可以节省更多的输入操作。有了别名,就可以用一个字符串来执行整个命令行。使用alias命令可以添加和列出别名。下面是一些例子:

alias p='pwd ; ls –CF'

alias rm='rm -i'

alias p='pwd ; ls -CF'

alias rm='rm -i'

在第一个例子中,分配字母P来运行命令pwd,然后运行ls  -CF输出当前工作目录,并以列的形式列出目录内容。第二个例子中,每次只需输入rm就可运行带有-i选项的rm命令(这通常是为根用户自动设置的别名。这样,它就不只是删除文件,而是每次删除文件时都会给出提示。这就可以防止因为错误地输入类似rm *.这样的命令而删除目录中的所有文件)。

处于shell中时,可以通过alias命令检查设置了哪些别名。如果想删除一个别名,可输入unalias(记住,如果在配置文件中设置了alias,那么在打开另一个shell时需要再次设置它)。

2.5.2  使用shell环境变量

每个活动的shell都储存一些需要在环境变量中使用的信息。环境变量可以储存诸如配置文件的位置、邮箱和路径目录等信息。它还可以存储shell提示符的值、历史列表的大小和操作系统的类型。

要查看当前分配给shell的环境变量,可输入declare命令(信息可能会有多屏,所以可输入declare|more)。要引用这些变量的值,可以将它添加到美元符号($)的后面或者放到命令行的任何位置。例如:

$ echo $USER

chris

该命令显示了USER变量的值,该变量保存了用户名(chris)。可以用其他任何值来代替USER,从而显示它的值。

2.5.2.1  通用shell环境变量

启动shell后(通过登录或者打开终端窗口),很多环境变量就已经设置好了。表2-8显示了一些变量,它们或者是在使用bash shell时设置,或者由您设置以使用不同的功能。

表2-8                                                        通用shell环境变量

变量

描述

BASH

包括bash命令的完整路径名。通常是/bin/bash

BASH_VERSION

表示当前bash命令版本号的数字

EUID

当前用户的有效用户ID号。它是在shell启动时根据/etc/passwd文件中的用户条目来分配的

FCEDIT

如果设置了该变量,那么它指示fc命令编辑history命令所使用的文本编辑器。如果未设置该变量,则使用vi命令

HISTFILE

历史文件的位置。该文件通常位于$HOME/.bash_history中

HISTFILESIZE

可储存的历史条目数。到达该数后,会抛弃最老的命令。其默认值是1000

HISTCMD

返回历史列表中当前命令的编号

HOME

这是主目录。它是每次登录或者输入带有任何选项的cd命令时的当前工作目录

HOSTTYPE

该值描述运行Linux系统的计算机架构。对于兼容intel的PC机,该值是i386、i486、i586、i686或i386-linux。对于AMD64位计算机,该值是x86_64

MAIL

这是邮箱文件的位置。该文件通常是/var/spool/mail目录中的用户名

OLDPWD

更改到当前工作目录之前的工作目录

OSTYPE

一个标识当前操作系统的名字。对于Fedora Core Linux,OSTYPE值是linux或者linux-gnu,这取决于所用的shell类型(bash可以运行在其他操作系统上)

PATH

用冒号分开的目录列表,用来查找输入的命令。对于普通用户而言,它的默认值是/bin:/usr/bin:/usr/local/bin:/usr/bin/X11:/usr/X11R6/bin:~/bin。如果想要运行的命令不在PATH中,就需要输入命令的完整路径或相对路径。对于根用户,该值还包括/sbin、/usr/sbin和/usr/local/sbin

PPID

启动当前shell的命令进程ID(例如它的父进程)

PROMPT_COMMAND

可以设置为每次在显示shell提示符前运行的命令名。设置PROMPT_COMMAND=date将在提示符出现前列出当前日期/时间

PS1

设置shell提示符的值。可以将很多条目加入到提示符中(日期、时间、用户名、主机名等)。有时一个命令需要额外的提示符,可以使用变量PS2、PS3等进行设置

PWD

这是被指定为当前目录的目录。每次使用cd命令改变目录时,该值都会变化

RANDOM

访问该变量会生成一个随机数。该数位于0~99999之间

SECONDS

Shell启动后所经过的时间,以秒为单位

SHLVL

与当前shell会话有关的shell级数。登录shell中时,SHLVL是1。每次启动一个新的bash命令时(例如,使用su成为一个新用户或者输入bash),该数会递增

TMOUT

可以设置为一个数值,表示shell不再接收输入的空闲时间,以秒为单位。达到这个秒数后,shell会退出。这是一个安全功能,它可使闲置的shell不会被未授权的人访问(必须在登录shell中设置该值,这样shell才会实际注销用户)

UID

分配给用户名的用户ID号。用户ID号存储在/etc/password文件中

2.5.2.2  设置自己的环境变量

环境变量提供了便捷的方法来储存在shell中常用的大量信息。可以创建任何所需的变量(除了那些正在使用的),这样在使用shell时就可以读取这些变量的值(bash手册页列出了正在使用的变量)。

要想临时设置一个环境变量,可以简单地输入变量名并为它赋值。下面是一个例子:

$ AB=/usr/dog/contagious/ringbearer/grind ; export AB

这个例子将一个很长的目录路径赋给AB变量。export AB命令表示将值输出到shell,这样就能够将该值传递到其他打开的shell中。设置AB后,输入下列命令就可进入该目录:

$ cd $AB

用这种方法设置环境变量的问题在于,一旦退出设置了该变量的shell,该设置就会丢失。要想永久设置变量,可将变量设置添加到bash配置文件,本节稍后对此进行介绍。

如果希望将其他文本也包括在环境变量的输出中,可以在变量两边加上括号。这样可防止变量名被误解。例如,如果想在前面所示的AB变量中添加一个命令名,则可以输入:

$ echo ${AB}/adventure

/usr/dog/contagious/ringbearer/grind/adventure

记住,必须导出变量,这样其他shell命令才能使用它。必须将导出的行添加到shell配置文件,这样在下次登录时才能使之生效。export命令相当灵活,并非必须在设置完变量后才能运行export命令,相反可在一步中完成,如下所示:

$ export XYZ=/home/xyz/bin

可以重写任何环境变量的值。通过输入新值可临时更改变量的值,或者在$HOME/.bashrc文件中添加一个新的导出行。需要更新的一个有用变量是PATH:

$ export PATH=$PATH:/home/xyz/bin

这个例子将/home/xyz/bin目录添加到PATH中,如果希望运行一批命令,而这些命令所在的目录通常不在PATH中,并且又不想每次都输入完全路径或相对路径,那么这是一项有用的技术。

如果决定不再设置某个变量,则可使用unset命令清除该变量的值。例如,可输入unset XYZ来清除XYZ的值(记住,如果在$HOME/.bashre文件中添加过导出内容,应删除这些内容,否则下次打开shell时它又会生效)。

2.5.3  管理后台和前台进程

如果通过网络或从哑终端(一个只允许文本输入,不支持GUI的监视器)使用Linux,那么shell可能就是全部。可能习惯于在视窗环境中同时运行很多程序,这样可根据需要在程序间进行切换。但shell在这方面看似功能十分有限。

尽管bash shell不包括可运行多个程序的GUI,但是它确实可以在前台和后台之间切换活动程序。这样就可以运行很多程序,同时有选择性地挑选一个需要处理的程序。

将活动程序放到后台的方法很多。其中一种是前面提到的,即在命令行的末尾添加一个&。另一种方法是使用at命令按某种方式运行没有连接到shell的命令。

按Ctrl+Z可以停止运行命令并将它放入后台。命令停止后,还可以让它在前台运行(fg命令)或在后台开始运行(bg命令)。

2.5.3.1  启动后台进程

如果想在shell中继续工作的同时运行某些程序,则可以将这些程序放入后台。为了在运行程序的时候将程序放入后台,可在命令的行尾输入一个&,如下所示:

$ find /usr > /tmp/allusrfiles &

这个示例命令查找Linux系统上的所有文件(从/usr开始)、显示这些文件名,并将这些名字放入/tmp/allusrfiles文件中,&在后台运行该命令行。要想检查后台中正在运行哪些命令,可使用jobs命令,如下所示:

$ jobs

[1] Stopped (tty output)  vi /tmp/myfile

[2] Running       find /usr -print > /tmp/allusrfiles &

[3] Running       nroff -man /usr/man2/* >/tmp/man2 &

[4]- Running       nroff -man /usr/man3/* >/tmp/man3 &

[5]+ Stopped       nroff -man /usr/man4/* >/tmp/man4

第1个任务是放入后台的文本编辑命令(vi),在编辑时可以按Ctrl+Z停止它。第2个任务是刚才运行的find命令。第3和第4个任务是后台中正在运行的nroff命令。第5个任务已在shell中运行(前台),直到几个进程完成,我认为运行的进程太多并按下Ctrl+Z停止第5个任务为止。

编号5旁边的加号(+)表示它是最新被放入后台的。编号4旁边的减号(-)表示它是在最近的后台任务之前被放入后台的。因为第1个任务需要终端输入,所以它不能在后台运行。因此,在它被再次放入前台之前它是Stopped。

要查看后台任务的进程ID,可在jobs命令后添加-l选项。如果输入ps,就可使用进程ID判断哪条命令是用于特定后台任务的。

2.5.3.2  使用前台和后台命令

继续使用上面的例子,可以把任务列表上的任何命令放入前台。例如,要再次编辑myfile,可输入:

$ fg %1

结果是再次启动vi命令,所有文本与停止vi任务时的相同。

将文本处理器、字处理器或者类似程序放入后台之前,确保已保存了文件。有时很容易忘记后台还有程序运行,所以如果注销或重新启动计算机,就会丢失数据。

要引用后台任务(以便取消它或者将它放入前台),在百分号(%)后使用任务号。也可以使用下面的命令来引用后台任务:

·    %:指最新被放入后台的命令(输入jobs命令后,输出中用加号指示这种命令)。这个操作会将该命令带回前台。

·    %string:指该任务包括一个以string字符开头的命令。该string必须是没有歧义的(换句话说,后台有两个vi命令时,输入%vi会导致出现错误消息)。

·    %?string:指在命令行的任何位置包含string的任务。该string必须是没有歧义的,否则匹配失败。

·    %--:指在最近停止的任务之前停止的任务。

如果停止了某个命令,可以使用bg命令在后台再次运行它。例如,在前面例子的任务列表中找到第5个任务:

[5]+ Stopped              nroff -man man4/* >/tmp/man4

输入下列命令:

$ bg %5

之后,该任务在后台运行。该任务项显示如下:

[5] Running                 nroff -man man4/* >/tmp/man4 &

 
0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:116324次
    • 积分:1992
    • 等级:
    • 排名:第19514名
    • 原创:58篇
    • 转载:100篇
    • 译文:0篇
    • 评论:0条
    文章分类