认识与学习 BASH
检查一下/etc/shells这个文件,即可知道有多少个可用的shells。系统上的某些服务在运行过程中,会检查用户能够使用的shells,这些shell的查询就是通过/etc/shells这个文件进行的。在/etc/passwd这个文件中记录着用户一旦登录所取得的shell。
bash是Linux默认的Shell,是GNU计划中的重要工具软件之一,当前页是GNU操作系统中的标准Shell,兼容于sh,是根据一些用户的需求而加强的shell版本。
Bash有如下的优点:
命令记忆功能(在家目录~/.bash_history中存储,当然存储的是上一次登录之后所执行的命令,这次登录之后所执行的命令还暂存在临时内存中,要等成功注销系统后这次的命令记忆才会写到前面所说的文件中)。
命令补全功能:只有在bash中才有。Tab按键,第一个字的后面试命令补全,第二个字的后面是文件补全。
命令别名(alias)设置功能例:alias lm=`ls -al`
作业控制、前台、后台控制
Shell scripts的强大功能
通配符
利用type这个命令来查看命令是外部命令(其他非basht套件所提供的命令)还是内置在bash中的命令:
[root@www ~]# type [-tpa] name 选项与参数: :不加任何选项与参数时,type 会显示出 name 是外部指令还是 bash 内建指令 -t :当加入 -t 参数时,type 会将 name 以底下这些字眼显示出他的意义: file :表示为外部指令; alias :表示该指令为命令别名所设定的名称; builtin :表示该指令为 bash 内建的指令功能; -p :如果后面接的 name 为外部指令时,才会显示完整文件名; -a :会由 PATH 变量定义的路径中,将所有含 name 的指令都列出来,包含 alias 范例一:查询一下 ls 这个指令是否为 bash 内建? [root@www ~]# type ls ls is aliased to `ls --color=tty' <==未加任何参数,列出 ls 的最主要使用情况 [root@www ~]# type -t ls alias <==仅列出 ls 执行时的依据 [root@www ~]# type -a ls ls is aliased to `ls --color=tty' <==最先使用 aliase ls is /bin/ls <==还有找到外部指令在 /bin/ls 范例二:那么 cd 呢? [root@www ~]# type cd cd is a shell builtin <==看到了吗? cd 是 shell 内建指令 |
此外,由于利用 type 搜寻后面的名称时,如果后面接的名称并不能以执行文件的状态被找到, 那么该名称是不会被显示出来的。也就是说, type 主要在找出『执行文件』! 呵呵!所以,这个 type 也可以用来作为类似 which 指令的用途(找指令)!
指令的下达
这里仅就反斜杠 (\) 来说明一下指令下达的方式啰!
范例:如果指令串太长的话,如何使用两行来输出?
[vbird@www ~]# cp /var/spool/mail/root /etc/crontab \
> /etc/fstab /root
上面这个指令用途是将三个档案复制到 /root 这个目录下。不过,因为指令太长,就调用『 \[Enter] 』将 [Enter] 这个按键『跳脱!』开来,让 [Enter] 按键不再具有『开始执行』的功能!好让指令可以继续在下一行输入。 需要特别留意, [Enter] 按键是紧接着反斜杠 (\) 的,两者中间没有其他字符。 因为 \ 仅跳脱『紧接着的下一个字符』而已!所以,万一我写成: 『 \ [Enter] 』,亦即 [Enter] 与反斜杠中间有一个空格时,则 \ 跳脱的是『空格键』而不是 [Enter] 按键!这个地方请再仔细的看一遍!很重要, 如果顺利跳脱 [Enter] 后,下一行最前面就会主动出现 > 的符号, 你可以继续输入指令啰!也就是说,那个 > 是系统自动出现的,你不需要输入。
变量:是以一组文字或符号,来替换一些设置或者是一串保留的数据用echo命令可以获取变量的内容,在获取变量时前面要加上$这个符号 例 echo $PATH。
或者是echo ${PATH}。修改设置变量名直接用等号(=)连接变量和内容即可。变量设置规则:
1:变量与变量内容用等号“=”来连接。
2:等号两边不能直接接空格符。
3:变量两边只能是英文字母与数字,但是数字不能是开头字符。
4:若有空格符,可以使用双引号“”或单引号‘’将变量内容结合起来,双引号内的特殊字符如 $ 等,可以保有原本的特性,如下所示:『var="lang is $LANG"』则『echo $var』可得『lang is en_US』单引号内的特殊字符则仅为一般字符 (纯文本),如下所示:『var='lang is $LANG'』则『echo $var』可得『lang is $LANG』
5:必要时需要以转义字符“\”将特殊字符(如回车,$ ,\,空格符 `等)变成一般字符。
6:在一串命令中,如果还需要通过其他命令提供的信息,可以使用`command`的方式 “`”是键盘上方数字键1左边的那个按键。
7:若要扩展变量内容,需要以双引号及$变量名称,如PATH=”$PATH”:/home继续累加内容。
8:若变量需要到其他子程序中执行,则需要使用export将变量变成环境变量。export PATH
9:通常大写字母为系统默认的变量,自行设计的变量可以使用小写字母。
10:取消变量的方法为:“unset 变量名称”
环境变量的功能
利用env命令可以显示出当前shell环境下所有环境变量以其内容(在命令提示符下直接敲env回车后可以看到许多内容)。其它所有的变量说明:set,这个命令可以将环境变量还有其它自定义变量以及所有的变量都列出来。
PS1:(提示字符的设定)
这 是 PS1 (数字的 1 不是英文字母),这个东西就是我们的『命令提示字符』喔! 当我们每次按下 [Enter] 按键去执行某个指令后,最后要再次出现提示字符时, 就会主动去读取这个变数值了。上头 PS1 内显示的是一些特殊符号,这些特殊符号可以显示不同的信息, 每个 distributions 的 bash 预设的 PS1 变量内容可能有些许的差异,不要紧,『习惯你自己的习惯』就好了。 你可以用 man bash 去查询一下 PS1 的相关说明,以理解底下的一些符号意义。
\d :可显示出『星期 月 日』的日期格式,如:"Mon Feb 2"
\H :完整的主机名称。举例来说,鸟哥的练习机为『www.vbird.tsai』
\h :仅取主机名称在第一个小数点之前的名字,如鸟哥主机则为『www』后面省略
\t :显示时间,为 24 小时格式的『HH:MM:SS』
\T :显示时间,为 12 小时格式的『HH:MM:SS』
\A :显示时间,为 24 小时格式的『HH:MM』
\@ :显示时间,为 12 小时格式的『am/pm』样式
\u :目前使用者的账号名称,如『root』;
\v :BASH 的版本信息,如鸟哥的测试主机板本为 3.2.25(1),仅取『3.2』显示
\w :完整的工作目录名称,由根目录写起的目录名称。但家目录会以 ~ 取代;
\W :利用 basename 函数取得工作目录名称,所以仅会列出最后一个目录名。
\# :下达的第几个指令。
\$ :提示字符,如果是 root 时,提示字符为 # ,否则就是 $ 啰~
[root@www /home/dmtsai 16:50 #12]#
那个 # 代表第 12 次下达的指令。那么应该如何设定 PS1 呢?可以这样啊:
[root@www ~ ]# cd /home [root@www home]# PS1='[\u@\h \w \A #\#]\$ ' [root@www /home 17:02 #85]# # 看到了吗?提示字符变了!变的很有趣吧!其中,那个 #85 比较有趣, # 如果您再随便输入几次 ls 后,该数字就会增加喔!为啥?上面有说明滴! |
$:(关于本 shell 的 PID)
钱字号本身也是个变量喔!这个咚咚代表的是『目前这个 Shell 的执行绪代号』,亦即是所谓的 PID (Process ID)。想要知道我们的 shell 的 PID ,就可以用:『 echo $$ 』即可!出现的数字就是你的 PID 号码。
?:(关于上个执行指令的回传值)一般来说,如果成功的执行该指令, 则会回传一个 0 值,如果执行过程发生错误,就会回传『错误代码』才对!一般就是以非为 0 的数值来取代。 我们以底下的例子来看看:
[root@www ~]# echo $SHELL /bin/bash <==可顺利显示!没有错误! [root@www ~]# echo $? 0 <==因为没问题,所以回传值为 0 [root@www ~]# 12name=VBird -bash: 12name=VBird: command not found <==发生错误了!bash回报有问题 [root@www ~]# echo $? 127 <==因为有问题,回传错误代码(非为0) # 错误代码回传值依据软件而有不同,我们可以利用这个代码来搜寻错误的原因喔! [root@www ~]# echo $? 0 # 咦!怎么又变成正确了?这是因为 "?" 只与『上一个执行指令』有关, # 所以,我们上一个指令是执行『 echo $? 』,当然没有错误,所以是 0 没错! |
自定义变量转化为环境变量:export(命令行下直接敲export,会显示出当前的环境变量)
export 变量可以让“变量”转换为环境变量,进而可以在子程序中使用。
语系文件的变量(locale)利用locale –a可以查询到Linux到底支持多少语系。/etc/sysconfig/i18n,可以在这个文件中加入与语系相关变量的设置内容。Linux的语系文件都放在/usr/lib/locale/这个目录中,如果其他语系变量都没有设置,那么设置了LC_ALL和LANG时,其它语系变量就会被这两个变量所取代。
变量的有效范围
环境变量可以被子程序引用,其他的自定义的变量内容就不会存在于子程序,也就是说我们自行设置的变量内容,只存在于当前shell环境中,在子程序中是不存在的。环境变量可以让子程序继续引用的原因:
1:当启动一个 shell,操作系统会分配一块内存给 shell 使用,此内存内置变量可让子程序取用
2:若在父程序利用 export 功能,可以让自订变量的内容写到上述的记忆区块当中(环境变量);
3:当加载另一个 shell 时 (亦即启动子程序,而离开原本的父程序了),子 shell 可以将父 shell 的环境变量所在的记忆区块导入自己的环境变量区块当中。
基本上环境变量可以看做是全局变量,而自定义变量可以看做是局部变量。
变量键盘读取、数组与声明:read,array,declare
read
要读取来自键盘输入的变量,就是用 read 这个指令。这个指令最常被用在 shell script 的撰写当中, 想要跟使用者对话?用这个指令就对了
[root@www ~]# read [-pt] variable 选项与参数: -p :后面可以接提示字符! - t :后面可以接等待的『秒数!』这个比较有趣~不会一直等待使用者啦! 范例一:让使用者由键盘输入一内容,将该内容变成名为 atest 的变量 [root@www ~]# read atest This is a test <==此时光标会等待你输入!请输入左侧文字看看 [root@www ~]# echo $atest This is a test <==你刚刚输入的数据已经变成一个变量内容! 范例二:提示使用者 30 秒内输入自己的大名,将该输入字符串作为名为 named 的变量内容 [root@www ~]# read -p "Please keyin your name: " -t 30 named Please keyin your name: VBird Tsai <==注意看,会有提示字符喔! [root@www ~]# echo $named VBird Tsai <==输入的数据又变成一个变量的内容了! |
read 之后不加任何参数,直接加上变量名称,那么底下就会主动出现一个空白行等待你的输入(如范例一)。 如果加上 -t 后面接秒数,例如上面的范例二,那么 30 秒之内没有任何动作时, 该指令就会自动略过了~
declare/typeset
declare 或 typeset 是一样的功能,就是在『声明变量的类型』。如果使用 declare 后面并没有接任何参数,那么 bash 就会主动的将所有的变量名称与内容通通叫出来,就好像使用 set 一样啦!
[root@www ~]# declare [-aixr] variable 选项与参数: -a :将后面名为 variable 的变量定义成为数组 (array) 类型 -i :将后面名为 variable 的变量定义成为整数数字 (integer) 类型 -x :用法与 export 一样,就是将后面的 variable 变成环境变量; -r :将变量设定成为 readonly 类型,该变量不可被更改内容,也不能 unset 范例一:让变量 sum 进行 100+300+50 的加总结果 [root@www ~]# sum=100+300+50 [root@www ~]# echo $sum 100+300+50 <==咦!怎么没有帮我计算加总?因为这是文字型态的变量属性啊! [root@www ~]# declare -i sum=100+300+50 [root@www ~]# echo $sum 450 <==瞭乎?? |
由于在预设的情况底下, bash 对于变量有几个基本的定义:
变量类型预设为『字符串』,所以若不指定变量类型,则 1+2 为一个『字符串』而不是『计算式』。bash 环境中的数值运算,预设最多仅能到达整数形态,所以 1/3 结果是 0;现在你晓得为啥你需要进行变量声明了吧?如果需要非字符串类型的变量,那就得要进行变量的声明才行啦!
范例二:将 sum 变成环境变量 [root@www ~]# declare -x sum [root@www ~]# export | grep sum declare -ix sum="450" <==果然出现了!包括有 i 与 x 的宣告! 范例三:让 sum 变成只读属性,不可更动! [root@www ~]# declare -r sum [root@www ~]# sum=tesgting -bash: sum: readonly variable <==老天爷~不能改这个变数了! 范例四:让 sum 变成非环境变量的自订变量吧! [root@www ~]# declare +x sum <== 将 - 变成 + 可以进行『取消』动作 [root@www ~]# declare -p sum <== -p 可以单独列出变量的类型 declare -ir sum="450" <== 看吧!只剩下 i, r 的类型,不具有 x 啰! |
declare 也是个很有用的功能~尤其是当我们需要使用到底下的数组功能时, 他也可以帮我们宣告数组的属性喔!不过,老话一句,数组也是在 shell script 比较常用的啦! 比较有趣的是,如果你不小心将变量设定为『只读』,通常得要注销再登入才能复原该变量的类型了!
数组 (array) 变量类型
在 bash 里头,数组的设定方式是:var[index]=content意思是说,我有一个数组名为 var ,而这个数组的内容为 var[1]=小明, var[2]=大明, var[3]=好明 .... 等等,那个 index 就是一些数字啦,重点是用中括号 ([ ]) 来设定的。 目前我们 bash 提供的是一维数组。因为要制作出数组, 通常与循环或者其它判断式交互使用才有比较高的存在意义!
范例:设定上面提到的 var[1] ~ var[3] 的变数。 [root@www ~]# var[1]="small min" [root@www ~]# var[2]="big min" [root@www ~]# var[3]="nice min" [root@www ~]# echo "${var[1]}, ${var[2]}, ${var[3]}" small min, big min, nice min |
数组的变量类型比较有趣的地方在于『读取』,建议直接以 ${数组} 的方式来读取,比较正确无误的啦!
与文件系统及程序的限制关系: ulimit
想象一个状况:我的 Linux 主机里面同时登入了十个人,这十个人不知怎么搞得, 同时开了 100 个档案,每个档案的大小约 10MBytes ,请问一下, 我的 Linux 主机的内存要有多大才够? 10*100*10 = 10000 MBytes = 10GBytes ... 老天爷,这样,系统不挂点才有鬼哩!为了要预防这个情况的发生,所以我们的 bash 是可以『限制用户的某些系统资源』的,包括可以开启的档案数量,可以使用的 CPU 时间,可以使用的内存总量等等。如何设定?用 ulimit 吧!
[root@www ~]# ulimit [-SHacdfltu] [配额]
选项与参数:
-H :hard limit ,严格的设定,必定不能超过这个设定的数值;
-S :soft limit ,警告的设定可以超过这个设定值但是若超过则有警告讯息。 在设定上,通常 soft 会比 hard 小,举例来说,soft 可设定为 80 而 hard 设定为 100,那么你可以使用到 90 (因为没有超过 100),但介于 80~100 之间时, 系统会有警告讯息通知你!
-a :后面不接任何选项与参数,可列出所有的限制额度;
-c :当某些程序发生错误时,系统可能会将该程序在内存中的信息写成档案(除错用),这种档案就被称为核心档案(core file)。此为限制每个核心档案的最大容量。
-f :此 shell 可以建立的最大档案容量(一般可能设定为 2GB)单位为 Kbytes
-d :程序可使用的最大断裂内存(segment)容量;
-l :可用于锁定 (lock) 的内存量
-t :可使用的最大 CPU 时间 (单位为秒)
-u :单一用户可以使用的最大程序(process)数量。
范例一:列出你目前身份(假设为root)的所有限制资料数值
[root@www ~]# ulimit -a
core file size (blocks, -c) 0 <==只要是 0 就代表没限制
data seg size (kbytes, -d) unlimited
scheduling priority (-e) 0
file size (blocks, -f) unlimited <==可建立的单一档案的大小
pending signals (-i) 11774
max locked memory (kbytes, -l) 32
max memory size (kbytes, -m) unlimited
open files (-n) 1024 <==同时可开启的档案数量
pipe size (512 bytes, -p) 8
POSIX message queues (bytes, -q) 819200
real-time priority (-r) 0
stack size (kbytes, -s) 10240
cpu time (seconds, -t) unlimited
max user processes (-u) 11774
virtual memory (kbytes, -v) unlimited
file locks (-x) unlimited
范例二:限制用户仅能建立 10MBytes 以下的容量的档案
[root@www ~]# ulimit -f 10240
[root@www ~]# ulimit -a
file size (blocks, -f) 10240 <==最大量为10240Kbyes,相当10Mbytes
[root@www ~]# dd if=/dev/zero of=123 bs=1M count=20
File size limit exceeded <==尝试建立 20MB 的档案,结果失败了!
还记得我们在第八章 Linux 磁盘文件系统里面提到过,单一 filesystem 能够支持的单一档案大小与 block 的大小有关。例如 block size 为 1024 byte 时,单一档案可达 16GB 的容量。但是,我们可以用 ulimit 来限制使用者可以建立的档案大小喔! 启用 ulimit -f 就可以来设定了!例如上面的范例二,要注意单位喔!单位是 Kbytes。 若改天你一直无法建立一个大容量的档案,记得瞧一瞧 ulimit 的信息
变量内容的删除与取代
变量的内容可以很简单的透过几个咚咚来进行去除喔!我们使用 PATH 这个变量的内容来做测试好了。 请你依序进行底下的几个例子来玩玩,比较容易感受到鸟哥在这里想要表达的意义:
范例一:先让小写的 path 自定义变量设定的与 PATH 内容相同
[root@www ~]# path=${PATH}
[root@www ~]# echo $path
/usr/kerberos/sbin:/usr/kerberos/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:
/usr/sbin:/usr/bin:/root/bin <==这两行其实是同一行啦!
范例二:假设我不喜欢 kerberos,所以要将前两个目录去除掉,如何显示?
[root@www ~]# echo ${path#/*kerberos/bin:}
/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin
上面这个范例很有趣的!他的重点可以用底下这张表格来说明:
${variable#/*kerberos/bin:} 上面的特殊字体部分是关键词!用在这种初除模式所必须存在的
${variable#/*kerberos/bin:} 这就是原本的变量名称,以上面范例二来说,这里就填写 path 这个『变量名称』啦!
${variable#/*kerberos/bin:} 这是重点!代表『从变量内容的最前面开始向右去除』,且仅去除最短的那个
${variable#/*kerberos/bin:} 代表要被去除的部分,由于 # 代表由前面开始去除,所以这里便由开始的 / 写起。需要注意的是,我们还可以透过通配符 * 来取代 0 到无穷多个任意字符
以上面范例二的结果来看, path 这个变量被去除的内容如下所示:
/usr/kerberos/sbin:/usr/kerberos/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:
/usr/sbin:/usr/bin:/root/bin <==这两行其实是同一行啦! 很有趣吧!这样了解了 # 的功能了吗?接下来让我们来看看底下的范例三!
范例三:我想要去除前面所有的目录,仅保留最后一个目录
[root@www ~]# echo ${path#/*:}
/usr/kerberos/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:
/root/bin <==这两行其实是同一行啦!
# 由于一个 # 仅去掉最短的那个,因此他去除的情况可以用底下的去除线来看:
#
/usr/kerberos/sbin:/usr/kerberos/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:
# /usr/sbin:/usr/bin:/root/bin <==这两行其实是同一行啦!
[root@www ~]# echo ${path##/*:}
/root/bin
# 嘿!多加了一个 # 变成 ## 之后,他变成『去除掉最长的那个数据』!亦即是:
#
/usr/kerberos/sbin:/usr/kerberos/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:
# /usr/sbin:/usr/bin:/root/bin <==这两行其实是同一行啦!
非常有趣!不是吗?因为在 PATH 这个发量得内容中,每个目录都是以冒号『:』隔开的, 所以要从头去除掉目录就是介于斜线 (/) 到冒号 (:) 之间的数据!但是 PATH 中不止一个冒号 (:) 啊! 所以 # 与 ##
就分别代表:
· # :符合取代文字的『最短的』那一个;
· ##:符合取代文字的『最长的』那一个
上面谈到的是『从前面开始去除变量内容』,那么如果想要『从后面向前去除变量内容』呢? 这个时候就得使用百分比 (%) 符号了!来看看范例四怎么做吧!
范例四:我想要去除最后面那个目录,亦即从 : 到 bin 为止的字符串
[root@www ~]# echo ${path%:*bin}
/usr/kerberos/sbin:/usr/kerberos/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:
/usr/sbin:/usr/bin <==注意啊!最后面一个目录不见去!
# 这个 % 符号代表由最后面开始向前去除!所以上面得到的结果其实是来自如下:
#
/usr/kerberos/sbin:/usr/kerberos/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:
# /usr/sbin:/usr/bin:/root/bin <==这两行其实是同一行啦!
范例五:那如果我只想要保留第一个目录呢?
[root@www ~]# echo ${path%%:*bin}
/usr/kerberos/sbin
# 同样的, %% 代表的则是最长的符合字符串,所以结果其实是来自如下:
#
/usr/kerberos/sbin:/usr/kerberos/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:
# /usr/sbin:/usr/bin:/root/bin <==这两行其实是同一行啦!
由于我是想要由变量内容的后面向前面去除,而我这个变量内容最后面的结尾是『/root/bin』, 所以你可以看到上面我去除的数据最终一定是『bin』,亦即是『:*bin』那个 * 代表通配符! 至于 % 与 %% 的意义其实与 # 及 ## 类似!这样理解否?
我们将这部份作个总结说明一下:
变量的测试与内容替换
在某些时刻我们常常需要『判断』某个变量是否存在,若变量存在则使用既有的设定,若变量不存在则给予一个常用的设定。 我们举底下的例子来说明好了,看看能不能较容易被你所理解呢!
范例一:测试一下是否存在 username 这个变量,若不存在则给予 username 内容为 root
[root@www ~]# echo $username
<==由于出现空白,所以 username 可能不存在,也可能是空字符串
[root@www ~]# username=${username-root}
[root@www ~]# echo $username
root <==因为 username 没有设定,所以主动给予名为 root 的内容。
[root@www ~]# username="vbird tsai" <==主动设定 username 的内容
[root@www ~]# username=${username-root}
[root@www ~]# echo $username
vbird tsai <==因为 username 已经设定了,所以使用旧有的设定而不以 root 取代
不过这还是有点问题!因为 username 可能已经被设定为『空字符串』了!果真如此的话,那你还可以使用底下的范例来给予 username 的内容成为 root 喔!
范例二:若 username 未设定或为空字符串,则将 username 内容设定为 root
[root@www ~]# username=""
[root@www ~]# username=${username-root}
[root@www ~]# echo $username
<==因为 username 被设定为空字符串了!所以当然还是保留为空字符串!
[root@www ~]# username=${username:-root}
[root@www ~]# echo $username
root <==加上『 : 』后若发现内容为空或者是未设定,都能够以后面的内容替换!
在大括号内有没有冒号『 : 』的差别是很大的!加上冒号后,被测试的变量未被设定或者是已被设定为空字符串时, 都能够用后面的内容 (本例中是使用 root 为内容) 来替换与设定!
命令别名设定: alias, unalias
命令别名是一个很有趣的东西,特别是你的惯用指令特别长的时候!还有,增加默认的选项在一些惯用的指令上面,可以预防一些不小心误杀档案的情况发生的时候! 举个例子来说,如果你要查询隐藏档,并且需要长的列出不一页一页翻看,那么需要下达『 ls -al | more 』这个指令,我是觉得很烦啦! 要输入好几个单字!那可不可以使用 lm 来简化呢?当然可以,你可以在命令行下面下达:
[root@www ~]# alias lm='ls -al | more'
那么如何知道目前有哪些的命令别名呢?就使用 alias 呀!
[root@www ~]# alias
至于如果要取消命令别名的话,那么就使用 unalias 吧!例如要将刚刚的lm 命令别名拿掉,就使用: [root@www ~]# unalias lm
登录消息显示数据:/etc/iss,/etc/motd
在终端接口(tty1~tty6)登录的时候,会有几行提示符,就是在/etc/iss里面的数据,如果想让用户在登录后获取一些消息,那么可以编辑在这个文件/etc/motd中,这样的话每个登录者在登录后就会看到。当我们使用 telnet 连接到主机时,主机的登入画面就会显示 /etc/issue.net 而不是 /etc/issue 呢!