📄 0320bash.htm
字号:
不要想太多!另外,咦!<span class=text_import2>为什么我们系统上的 shell 要写入
/etc/shells 这个档案啊?</span> 这是因为系统某些服务在运行过程中,
会去检查使用者能够使用的 shells ,而这些 shell 的查询就是藉由 /etc/shells 这个档案棉!<br><br>
举例来说,某些 FTP 网站会去检查使用者的可用 shell ,而如果你不想要让这些使用者使用 FTP
以外的主机资源时,可能会给予该使用者一些怪怪的 shell,让使用者无法以其他服务登入主机。
这个时候,你就得将那些怪怪的 shell 写到 /etc/shells 当中了。举例来说,我们的 FC4
的 /etc/shells 里头就有个 /sbin/nologin 档案的存在,这个就是我们说的怪怪的 shell 棉~<br><br>
那么,再想一想,我这个使用者什么时候可以取得 shell 来工作呢?还有,
我这个使用者预设会取得哪一个 shell 啊?!还记得我们在
<a href="0160startlinux.php#start_cmd">首次进入 Linux -- 以文字方式登入</a>
那个章节当中提到的登入动作吧?当我登入的时候,系统就会给我一个 shell 让我来工作了。
而这个登入取得的 shell 就记录在 /etc/passwd 这个档案内!这个档案的内容是啥?<br>
<table class="term"><tr><td class="term"><pre>
[root@linux ~]# <span class=term_command>cat /etc/passwd</span>
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
<span class=term_say>.....(中间省略).....</span>
</pre></td></tr></table>
如上所示,在每一行的最后一个资料,就是您登入后,可以取得的预设的 shell 啦!
那你也会看到, root 是 /bin/bash ,不过,系统帐号 bin 与 daemon 等等,就使用那个怪怪的
/sbin/nologin 棉~关于使用者这部分的内容,我们留在
<a href="0410accountmanager.php">帐号管理</a> 时提供更多的说明。<br><br>
</div>
<hr><a name=bash_bash></a><img src="../images/penguin-s.gif" alt="小标题的图示" height="23" width="16" align="middle" /><span class=text_h2>Bash shell 的功能</span><br>
<div class=block2>
既然 /bin/bash 是 Linux 预设的 shell ,那么总是得了解一下这个玩意儿吧!
BASH 是怎么一回事呢?这个 shell 是 GNU 计画中重要的工具软体之一,目前也是
GNU 作业系统中标准的 shell ,他主要相容于 sh ,并且依据一些使用者需求,而加强的
shell 版本,可以说目前几乎所有的 Linux distribution 都是使用 bash 作为管理核心的主要
shell !因此,不论您使用的是那个 distribution ,你都难逃需要学习 bash 的宿命啦!那么这个
shell 有什么好处,干嘛 Linux 要使用他作为预设的 shell 呢? BASH 主要的优点有底下几个∶<br><br>
<li><span class=text_import1>命令编修能力(类似 DOS 的 doskey 功能)∶</span></li>
<div class=block2>
使用 bash 里头,个人认为相当棒的一个功能就是『他能记忆使用过的指令!』
这功能真的相当的棒!因为我只要在指令列按『上下键』就可以找到前一个输入的指令!而在很多
distribution 里头,预设的指令记忆功能可以到达 1000 个!也就是说,
你曾经下达过的指令都被记录下来了,记录的档案在你的家目录内的
<span class=text_import2><font face="细明体">.bash_history</font></span>
!不过,需要留意的是,
<span class=text_import2>~/.bash_history 记录的是前一次登入以前所执行过的指令,
而至于这一次登入所执行的指令都被暂存在暂记忆体中,当您成功的登出系统后,该指令记忆才会记录到
.bash_history 当中</span>!<br><br>
这有什么功能呢?最大的好处就是可以『<span class=text_import2>查询曾经做过的举动</span>!』,
如此可以知道你的执行步骤,那么就可以追踪您曾下达的指令,以作为除错的工具!
但如此一来也有个烦恼,就是如果被骇客入侵了,那么他只要翻你曾经执行过的指令,
刚好你的指令又跟系统有关(例如直接输入 MySQL 的密码在指令列上面)那么很容易就被破解你的
Linux 主机!所以,<span class=text_import2>最好是将记录的指令数目减小一点较好</span>!<br><br>
</div>
<li><span class=text_import1>命令与档案补全功能∶</span></li>
<div class=block2>
还记得我们在 <a href="0160startlinux.php#cmd_hkey">首次进入 Linux 的热门按键</a> 一节当中提到的
[tab] 这个按键吗?!这个按键的功能就是在 bash 里头才有的啦!常常在 bash 环境中使用 [tab]
是个很棒的习惯喔!因为至少可以让你 1)少打很多字; 2)确定输入的资料是正确的!
使用 [tab] 按键的时机依据 [tab] 接在指令后或参数后而有所不同。我们再复习一次∶
<ul><span class=text_import2>
<li>[Tab] 接在一串指令的第一个字的后面,则为命令补全;
<li>[Tab] 接在一串指令的第二个字以后时,则为『档案补齐』!</ul></span>
所以说,如果我想要知道我的环境中,所有可以执行的指令有几个?
就直接在 bash 的提示字元后面输入两个 [tab][tab] 就能够输出所有的可执行指令了。
那如果想要知道系统当中所有以 c 为开头的指令呢?就按下 c[tab][tab] 就好啦! ^_^<br><br>
是的!真的是很方便的功能,所以,<span class=text_import2>有事没事,在
bash shell 底下,多按几次 [tab] 是一个不错的习惯啦</span>!<br><br>
</div>
<li><span class=text_import1>命令别名(alias)设定功能∶</span></li>
<div class=block2>
假如我需要知道这个目录底下的所有档案(包含隐藏档)及所有的档案属性,那么我就必须要下达
ls -al 这样的指令列,唉!真麻烦,有没有更快的取代方式?呵呵!就使用命令别名呀!例如我最喜欢直接以
lm 这个自订的命令来取代上面的命令,也就是说, lm 会等于 ls -al 这样的一个功能,嘿!那么要如何作呢?就使用
alias 即可!你可以在指令列输入 alias 就可以知道目前的命令别名有哪些了!也可以直接下达命令来设定别名呦∶
<ul><span class=text_import2><font face="细明体">alias lm='ls -al'</font></span></ul>
</div>
<li><span class=text_import1>工作控制(jobs)、前景背景控制∶</span></li>
<div class=block2>
这部分我们在之后的<a href="0440processcontrol.php">资源管理</a>章节中会再提及!
使用前、背景的控制可以让工作进行的更为顺利!至于工作控制(jobs)的用途则更广,
可以让我们随时将工作丢到背景中执行!而不怕不小心使用了
[Ctrl] + c 来停掉该程序!真是好样的!此外,也可以在单一登入的环境中,达到多工的目的呢!<br><br>
</div>
<li><span class=text_import1>Shell scripts 的强大功能∶</span></li>
<div class=block2>
在 DOS 年代还记得将一堆指令写在一起的所谓的『批次档』吧?在 Linux 底下的
shell scripts 则发挥的更为强大的功能,可以将您日常生活当中常需要下达的连续指令写成一个档案,
该档案并且可以透过对谈互动式的方式来进行主机的侦测工作!也可以藉由
shell 提供的环境变数及相关指令来进行设计,哇!整个设计下来几乎就是一个小型的程式语言了!该
scripts 的功能真的是超乎我的想像之外!以前在 DOS 底下需要程式语言才能写的东西,在
Linux 底下使用简单的 shell scripts 就可以帮你达成了!真的厉害!!这部分我们在后续章节再来谈!<br><br>
</div>
<li><span class=text_import1>万用字元!</span></li>
<div class=block2>
除了完整的字串之外, bash 还支援许多的万用字元来帮助使用者查询与指令下达。
举例来说,想要知道 /usr/X11R6/bin 底下有多少以 xt 为开头的档案吗?使用∶
ls -l /usr/X11R6/bin/xt* 就能够知道棉~此外,还有其他可供利用的万用字元,
这些都能够加快使用者的操作呢!
</div>
</div>
<hr><a name=bash_type></a><img src="../images/penguin-s.gif" alt="小标题的图示" height="23" width="16" align="middle" /><span class=text_h2>Bash shell 的内建命令∶ type</span><br>
<div class=block2>
我们在首次进入 Linux 章节当中,提到关于 <a href="0160startlinux.php#manual_man">Linux 的线上说明文件</a>
部分,也就是 man page 的内容,那么 bash 有没有什么说明文件啊?开玩笑~
这么棒的东西怎么可能没有说明文件!请您在 shell 的环境下,直接输入 man bash 瞧一瞧,
嘿嘿!不是盖的吧!让您看个几天几夜也无法看完的 bash 说明文件,可是很详尽的资料啊! ^_^<br><br>
不过,在这个 man bash 所出现的 man page 当中,不知道您是否有察觉到,咦!
怎么这个说明文件里面有其他的档案说明啊?举例来说,那个 cd 指令的说明就在这个 man page 内?
然后我直接输入 man cd 时,怎么出现的画面中,最上方竟然出现一堆指令的介绍??这是怎么回事?
为了方便 shell 的操作,其实 bash 已经『内建』了很多指令了,例如上面提到的 cd ,
还有例如 umask 等等的指令,都是内建在 bash 当中的呢!<br><br>
那我怎么知道这个指令是来自于外部指令(指的是其他非 bash 套件所提供的指令) 或是内建在 bash 当中的呢?
嘿嘿!利用 type 这个指令来观察即可!举例来说∶<br>
<table class="term"><tr><td class="term"><pre>
[root@linux ~]# <span class=term_command>type [-tpa] name</span>
<span class=term_say>参数∶
∶不加任何参数时,则 type 会显示出那个 name 是外部指令还是 bash 内建的指令!
-t ∶当加入 -t 参数时,type 会将 name 以底下这些字眼显示出他的意义∶
file ∶表示为外部指令;
alias ∶表示该指令为命令别名所设定的名称;
builtin ∶表示该指令为 bash 内建的指令功能;
-p ∶如果后面接的 name 为指令时,会显示完整档名(外部指令)或显示为内建指令;
-a ∶会将由 PATH 变数定义的路径中,将所有含有 name 的指令都列出来,包含 alias
范例∶</span>
<span class=term_hd>范例一∶查询一下 ls 这个指令是否为 bash 内建?</span>
[root@linux ~]# <span class=term_command>type ls</span>
ls is aliased to `ls --color=tty'
<span class=term_say># 没有加上任何参数,仅列出 ls 这个指令的最主要使用情况</span>
[root@linux ~]# <span class=term_command>type -t ls</span>
alias
<span class=term_say># -t 参数则仅列出 ls 这个指令的最主要使用情况说明</span>
[root@linux ~]# <span class=term_command>type -a ls</span>
ls is aliased to `ls --color=tty'
ls is /bin/ls
<span class=term_say># 利用所有方法找出来的 ls 相关资讯都会被列出来!</span>
<span class=term_hd>范例二∶那么 cd 呢?</span>
[root@linux ~]# <span class=term_command>type cd</span>
cd is a shell builtin
</pre></td></tr></table>
透过 type 这个指令的用途,我们可以知道每个指令是否为 bash 的内建指令。
此外,由于利用 type 搜寻后面的名称时,如果后面接的名称并不能以执行档的状态被找到,
那么该名称是不会被显示出来的。举例来说,您的 FC4 应该不会有 vbird 这个指令吧?!
输入 type -p vbird 看一下,果然没有输出任何资料!而如果您输入的是 type -p touch 呢?
则会出现 /bin/touch !呵呵!所以,<span class=text_import2>这个 type 也可以用来作为类似 which
指令的用途啦!</span>找指令用的!<br><br>
</div>
<hr><a name=bash_command></a><img src="../images/penguin-s.gif" alt="小标题的图示" height="23" width="16" align="middle" /><span class=text_h2>指令的下达</span><br>
<div class=block2>
我们在 <a href="0160startlinux.php">首次进入 Linux</a> 一节当中,已经提到过在 shell
环境下的指令下达方式,不过,因为这个部分实在很重要,所以,我们还是再次的提醒一次!<br>
<table class="term"><tr><td class="term"><pre>
[root@linux ~]# <span class=term_command>command [-options] parameter1 parameter2 ...</span>
<span class=term_note> 指令 选项 参数(1) 参数(2)</span>
<span class=term_say>说明∶
0. 一行指令中第一个输入的绝对是『指令(command)』或『可执行档案』
1. command 为指令的名称,例如变换路径的指令为 cd 等等;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -