Fedora 和 Red Hat 系统管理/Shell 基础
从你连接到 SSH 会话,登录到文本控制台,或从图形环境打开终端的那一刻起,你就在与 shell 程序交互。简单来说,shell 提供了你的命令行。它接收你输入的命令,并在需要时运行程序来服务这些命令。
Bash 是 GNU/Linux 系统中最流行的 shell,它的基础是源于最初的 UNIX shell,即 Borne Shell。虽然 Borne Shell 在它那个时代是革命性的,但按照今天的标准来说,它相当笨拙。像命令行编辑、命令历史和作业控制这样的概念是在后来其他 shell 中演变出来的,这些 shell 试图取代最初的 Borne Shell,例如 C shell 和 Korn Shell。虽然这些特性极大地增强了 shell 的可用性,但它们也付出了破坏与 Borne Shell 语法兼容性的代价。当 GNU 项目设计他们的 shell 时,他们选择实现这些新想法,但仍然保持与最初的 Borne Shell 的兼容性。他们将他们的 shell 称为 Borne Again Shell,或者简称为 Bash。
shell 的基本思想与最初的 shell 并没有太大区别,但命令历史、命令行编辑以及 shell 脚本中使用的特性则更加特殊。
shell 中的命令采用基本形式
COMMAND [-OPTIONS]... [ARG]...
(通常将变量放在大写字母中,并将可选元素放在方括号中。省略号表示前面的内容可以重复)。
COMMAND 可以是以下四种之一
- 程序 - shell 将在你的 PATH 环境变量中搜索名为 COMMAND 的程序。大多数程序都在 /bin 或 /usr/bin 中。命令的文档通常可以在手册页中找到(使用 `man COMMAND' 访问)。
- shell 内置命令 - 内置命令是由 shell 直接处理的命令,例如 cd、echo 和 alias。内置命令的文档可以在 bash 的手册页中找到,或者使用 help 内置命令:`help COMMAND'。
- 别名 - 别名在命令运行之前进行处理,并被替换为另一个命令,可能添加选项或参数。
- 函数 - 函数调用一系列命令,在 shell 脚本中比在典型的命令行中更常使用。
一些最简单的命令是内置命令。例如,echo 只需打印传递给它的参数
[jtk@athena ~]$ echo Hello, World! Hello, World!
pwd 内置命令打印工作目录;cd 更改工作目录。(我们将在讨论文件系统基础知识时定义“工作目录”)。
[jtk@athena ~]$ pwd /home/jtk [jtk@athena ~]$ cd /usr/share/doc/bash-3.1/ [jtk@athena bash-3.1]$ pwd /usr/share/doc/bash-3.1 [jtk@athena bash-3.1]$ cd [jtk@athena ~]$ pwd /home/jtk
help 内置命令提供内置命令的文档。没有参数,它会列出所有内置命令。使用参数,help 可以提供有关特定内置命令的详细信息
[jtk@athena ~]$ help GNU bash, version 3.1.7(1)-release (i386-redhat-linux-gnu) These shell commands are defined internally. Type `help' to see this list. Type `help name' to find out more about the function `name'. Use `info bash' to find out more about the shell in general. Use `man -k' or `info' to find out more about commands not in this list. A star (*) next to a name means that the command is disabled. JOB_SPEC [&] (( expression )) . filename [arguments] : [ arg... ] (( expression )) alias [-p] [name[=value] ... ] bg [job_spec ...] bind [-lpvsPVS] [-m keymap] [-f fi break [n] builtin [shell-builtin [arg ...]] caller [EXPR] case WORD in [PATTERN [| PATTERN]. cd [-L|-P] [dir] command [-pVv] command [arg ...] compgen [-abcdefgjksuv] [-o option complete [-abcdefgjksuv] [-pr] [-o continue [n] declare [-afFirtx] [-p] [name[=val dirs [-clpv] [+N] [-N] disown [-h] [-ar] [jobspec ...] echo [-neE] [arg ...] enable [-pnds] [-a] [-f filename] eval [arg ...] exec [-cl] [-a name] file [redirec exit [n] export [-nf] [name[=value] ...] or false fc [-e ename] [-nlr] [first] [last fg [job_spec] for NAME [in WORDS ... ;] do COMMA for (( exp1; exp2; exp3 )); do COM function NAME { COMMANDS ; } or NA getopts optstring name [arg] hash [-lr] [-p pathname] [-dt] [na help [-s] [pattern ...] history [-c] [-d offset] [n] or hi if COMMANDS; then COMMANDS; [ elif jobs [-lnprs] [jobspec ...] or job kill [-s sigspec | -n signum | -si let arg [arg ...] local name[=value] ... logout popd [+N | -N] [-n] printf [-v var] format [arguments] pushd [dir | +N | -N] [-n] pwd [-LP] read [-ers] [-u fd] [-t timeout] [ readonly [-af] [name[=value] ...] return [n] select NAME [in WORDS ... ;] do CO set [--abefhkmnptuvxBCHP] [-o opti shift [n] shopt [-pqsu] [-o long-option] opt source filename [arguments] suspend [-f] test [expr] time [-p] PIPELINE times trap [-lp] [arg signal_spec ...] true type [-afptP] name [name ...] typeset [-afFirtx] [-p] name[=valu ulimit [-SHacdfilmnpqstuvx] [limit umask [-p] [-S] [mode] unalias [-a] name [name ...] unset [-f] [-v] [name ...] until COMMANDS; do COMMANDS; done variables - Some variable names an wait [n] while COMMANDS; do COMMANDS; done { COMMANDS ; } [jtk@athena ~]$ help help help: help [-s] [pattern ...] Display helpful information about builtin commands. If PATTERN is specified, gives detailed help on all commands matching PATTERN, otherwise a list of the builtins is printed. The -s option restricts the output for each builtin command matching PATTERN to a short usage synopsis. [jtk@athena ~]$ help cd cd: cd [-L|-P] [dir] Change the current directory to DIR. The variable $HOME is the default DIR. The variable CDPATH defines the search path for the directory containing DIR. Alternative directory names in CDPATH are separated by a colon (:). A null directory name is the same as the current directory, i.e. `.'. If DIR begins with a slash (/), then CDPATH is not used. If the directory is not found, and the shell option `cdable_vars' is set, then try the word as a variable name. If that variable has a value, then cd to the value of that variable. The -P option says to use the physical directory structure instead of following symbolic links; the -L option forces symbolic links
你使用的大多数命令都是程序。也就是说,它们是与 bash shell 在单独进程中运行的单独程序。这些程序可以在系统上的许多位置找到。搜索的目录在 PATH 环境变量中指定,但我们稍后会详细介绍。大多数程序都位于 /bin 或 /usr/bin 目录中,我们现在将重点关注这些目录。
如果我想获取目录中文件的列表,我会使用 ls 命令。当你输入“ls”时实际运行的程序位于 /bin/ls。如果不带参数调用,ls 将列出当前目录中的文件。可以使用参数来告诉它列出哪个目录。可以使用选项来告诉它如何列出文件
[jtk@athena ~]$ ls bin Desktop google-earth svn [jtk@athena ~]$ ls -l drwxrwxr-x 2 jtk jtk 4096 Dec 1 12:32 bin drwxr-xr-x 8 jtk jtk 4096 Jan 11 13:51 Desktop drwxr-xr-x 9 jtk jtk 4096 Dec 17 22:21 google-earth -rw-r--r-- 1 jtk jtk 16791707 Dec 5 16:43 livejournal.tar.bz2 drwxrwxr-x 2 jtk jtk 4096 Dec 8 13:23 svn [jtk@athena ~]$ ls -lt drwxrwxr-x 2 jtk jtk 4096 Dec 1 12:32 bin -rw-r--r-- 1 jtk jtk 16791707 Dec 5 16:43 livejournal.tar.bz2 drwxrwxr-x 2 jtk jtk 4096 Dec 8 13:23 svn drwxr-xr-x 9 jtk jtk 4096 Dec 17 22:21 google-earth drwxr-xr-x 8 jtk jtk 4096 Jan 11 13:51 Desktop [jtk@athena ~]$ ls /home/ db2inst1 jtk lost+found [jtk@athena ~]$ ls -l /home/ total 24 drwxr-xr-x 7 db2inst1 db2iadm1 4096 Jul 17 2006 db2inst1 drwx------ 11 jtk jtk 4096 Feb 2 11:47 jtk drwx------ 2 root root 16384 Apr 19 2006 lost+found
请注意选项字符串“-lt”。“l”指定“长”列表,而“t”指定条目应按修改时间排序。这些是单字符选项,可以单独指定为“-l -t”,但通常像这样分组在一起。
通常将选项放在参数之前,例如在命令“ls -l /home”中。对于 GNU 工具,这是可选的,但有些工具会在相同参数之后出现任何选项时报错。(对于 shell 或操作系统来说,选项和参数之间没有区别。当内核执行命令时,它们都是参数,程序负责解释它们)。
如果你是一个非 root 用户,并且需要安装或运行需要管理员凭据的命令,只需执行以下操作
[jtk@athena ~]$ su root Enter root password Run the command you want (as root).
就这么简单。
如果你是一个用户,并且想要列出机器的 IP 地址,可以使用 sudo 命令,现在让我们假设你被允许使用 sudo 命令
# sudo /sbin/ifconfig
类似地,你可以使用 sudo 运行任何超级用户命令