跳转到内容

Fedora 和 Red Hat 系统管理/Shell 基础

来自维基教科书,开放书籍,开放世界

从你连接到 SSH 会话,登录到文本控制台,或从图形环境打开终端的那一刻起,你就在与 shell 程序交互。简单来说,shell 提供了你的命令行。它接收你输入的命令,并在需要时运行程序来服务这些命令。

Bash 是 GNU/Linux 系统中最流行的 shell,它的基础是源于最初的 UNIX shell,即 Borne Shell。虽然 Borne Shell 在它那个时代是革命性的,但按照今天的标准来说,它相当笨拙。像命令行编辑、命令历史和作业控制这样的概念是在后来其他 shell 中演变出来的,这些 shell 试图取代最初的 Borne Shell,例如 C shellKorn Shell。虽然这些特性极大地增强了 shell 的可用性,但它们也付出了破坏与 Borne Shell 语法兼容性的代价。当 GNU 项目设计他们的 shell 时,他们选择实现这些新想法,但仍然保持与最初的 Borne Shell 的兼容性。他们将他们的 shell 称为 Borne Again Shell,或者简称为 Bash

shell 的基本思想与最初的 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 用户身份运行命令示例

[编辑 | 编辑源代码]

如果你是一个非 root 用户,并且需要安装或运行需要管理员凭据的命令,只需执行以下操作

[jtk@athena ~]$ su root
Enter root password
Run the command you want (as root).

就这么简单。

如果你是一个用户,并且想要列出机器的 IP 地址,可以使用 sudo 命令,现在让我们假设你被允许使用 sudo 命令

# sudo /sbin/ifconfig 

类似地,你可以使用 sudo 运行任何超级用户命令

华夏公益教科书