管理整个计算机硬件的是操作系统的核心 (kernel),这个核心是需要被保护的! 所以一般使用者就只能透过 shell 来跟核心沟通,以让核心完成我们的工作。
硬件、核心与 Shell
让计算机播放声音:
- 硬件:『声卡芯片』;
- 核心管理:操作系统的核心可以支持这个芯片组,提供芯片的驱动程序;
- 应用程序:需要使用者输入发生声音的命令!
图 1.1.1、硬件、核心与用户的相关性图示
shell只是提供给用户操作操作系统的一个接口,因此sell其实就是软件。命令,包括 man, chmod, chown, vi, fdisk, mkfs都是独立的应用程序, 但是我们可以透过壳程序 (就是命令列模式) 来操作这些应用程序,让这些应用程序呼叫核心来运行所需的工作!
Tips: 只要是提供给用户操作操作系统的应用程序都称为壳程序。狭义的壳程序指的是命令行方面的软件,包括 bash 等。 广义的壳程序则包括图形接口的软件!因为图形接口也能够操作各种应用程序来呼叫核心工作! |
为何要学文字接口的 shell?
- 文字接口的 shell:大家都一样!
- 远程管理:文字接口就是比较快!
较不容易出现断线或者是信息外流的问题
- Linux 的任督二脉: shell 是也!
系统的合法 shell 与 /etc/shells 功能
Linux 使用『 Bourne Again SHell (简称 bash) 』,这个 Shell 是 Bourne Shell 的增强版本,也是基于 GNU 的架构下发展出来的!
第一个流行的 shell 是由 Steven Bourne 发展出来的,为了纪念他所以就称为 Bourne shell ,或直接简称为 sh !而后来另一个广为流传的 shell 是由柏克莱大学的 Bill Joy 设计依附于 BSD 版的 Unix 系统中的 shell ,这个 shell 的语法有点类似 C 语言,所以才得名为 C shell ,简称为 csh !由于在学术界 Sun 主机势力相当的庞大,而 Sun 主要是 BSD 的分支之一,所以 C shell 也是另一个很重要而且流传很广的 shell 之一 。
/etc/shells:
- /bin/sh (已经被 /bin/bash 所取代)
- /bin/bash (就是 Linux 默认的 shell)
- /bin/ksh (Kornshell 由 AT&T Bell lab. 发展出来的,兼容于 bash)
- /bin/tcsh (整合 C Shell ,提供更多的功能)
- /bin/csh (已经被 /bin/tcsh 所取代)
- /bin/zsh (基于 ksh 发展出来的,功能更强大的 shell)
为什么我们系统上合法的 shell 要写入 /etc/shells 这个文件? 这是因为系统某些服务在运行过程中,会去检查使用者能够使用的 shells !
举例来说,某些 FTP 网站会去检查使用者的可用 shell ,而如果你不想要让这些使用者使用 FTP 以外的主机资源时,可能会给予该使用者一些特殊的 shell,让使用者无法以其他服务登陆主机。 这个时候,你就得将那些特殊的 shell 写到 /etc/shells 当中了。举例来说,我们的 CentOS 5.x 的 /etc/shells 里头就有个 特殊的shell /sbin/nologin
登陆后取得的 shell配置在 /etc/passwd 这个文件内!
[root@www ~]# cat /etc/passwd root:x:0:0:root:/root:/bin/bash bin:x:1:1:bin:/bin:/sbin/nologin daemon:x:2:2:daemon:/sbin:/sbin/nologin .....(底下省略)..... |
如上所示,在每一行的最后一个数据,就是你登陆后可以取得的默认的 shell!
Bash shell 的功能
bash 主要的优点:
- 命令编修能力 (history):
只要在命令行按『上下键』就可以找到前/后一个输入的命令!在很多 distribution 里头,默认的命令记忆功能可以到达 1000 个!这么多的命令记录在你家目录内的 .bash_history! 不过,需要留意的是,~/.bash_history 记录的是前一次登陆以前所运行过的命令, 而至于这一次登陆所运行的命令都被缓存在内存中,当你成功的注销系统后,该命令记忆才会记录到 .bash_history 当中!
- 命令与文件补全功能: ([tab] 按键的好处)
- [Tab] 接在一串命令的第一个字的后面,则为命令补全;
- [Tab] 接在一串命令的第二个字以后时,则为『文件补齐』!
- 命令别名配置功能: (alias)
在命令行输入 alias 就可以知道目前的命令别名有哪些了!也可以直接下达命令来配置别名:
alias lm='ls -al'
- 工作控制、前景背景控制: (job control, foreground, background)
- 程序化脚本: (shell scripts)
- 通配符: (Wildcard)
除了完整的字符串之外, bash 还支持许多的通配符来帮助用户查询与命令下达。 例如『 ls -l /usr/bin/X* 』
Bash shell 的内建命令: type
为了方便 shell 的操作,bash 已经『内建』了很多命令了,例如 cd ,umask !
[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 主要在找出『运行档』而不是一般文件档名!
范例:如果命令串太长的话,如何使用两行来输出? [vbird@www ~]# cp /var/spool/mail/root /etc/crontab \ > /etc/fstab /root |
当我们顺利地在终端机 (tty) 上面登陆后, Linux 就会依据 /etc/passwd 文件的配置给我们一个 shell (默认是 bash),然后我们就可以依据上面的命令下达方式来操作 shell,