ca

 

bash shell

bash shell 是 Linux 中的众多可用 shell 的其中之一。它也被称为 Bourne-again shell,这是以早期 shell(/bin/sh)的创建者 Stephen Bourne 命名的。Bash 在本质上是与 sh 兼容的,但是在函数和编程功能方面提供了许多改进。它合并了来自 Korn shell (ksh) 和 C shell (csh) 的特性,并且准备成为与 POSIX 兼容的 shell。

在我们深入研究 bash 之前,首先回忆一下,shell 是一个可以接受并执行命令的程序。它还支持编程结构,允许从比较小的部分构建复杂的命令。这些复杂的命令,即脚本,可以被保存为文件,从而构成新的命令。事实上,典型 Linux 系统中的许多命令都是脚本。

Shells 具有一些内置 命令,比如 cdbreakexec。其他命令是外部的

Shell 还使用三个标准 I/O

  • stdin标准输入流,为命令提供输入。
  • stdout标准输出流,为命令显示输出。
  • stderr标准错误流,显示命令中的错误输出。

输入流为程序提供输入,通常来自终端键盘。输出流输出文本字符,通常输出到终端。终端最初是一个 ASCII 打字机或显示终端,但是现在往往为图形桌面上的一个窗口。有关重定向这些标准 I/O 流的更多细节将在本 系列 系列的另一篇文章中介绍。

在本文后面的内容中,我们将假设您知道如何获得一个 shell 提示。如果您不知道的话,请参考 developerWorks 文章 “Linux 开发新手基本任务”,其中介绍了如何完成这个操作以及其他内容。

如果使用不带图形桌面的 Linux 系统,或者在一个图形桌面中打开终端窗口,您将看到一个提示,可能类似于清单 1 所示。


清单 1. 一些典型的用户提示
				
[db2inst1@echidna db2inst1]$
ian@lyrebird:~>
$

如果作为根用户(或者超级用户)登录,您看到的提示应该如清单 2 所示。


清单 2. 超级用户或根用户的提示示例
				
[root@echidna ~]#
lyrebird:~ #
#

根用户具有相当大的权力,因此使用时应十分小心。当您拥有根权限时,大部分提示都包括一个 # 符号。普通用户的权限通常使用一个不同的字符加以区别,通常为一个美元符号($)。您实际看到的提示可能不同于本文显示的示例。您的提示也许包括用户名、主机名、当前目录、日期或输出提示的时间,等等。

这些文章包含的代码示例剪切自真实的 Linux 系统,使用了默认的提示。我们的根提示包含一个拖尾 # 号,因此您可以将它们与普通用户提示区分开,因为后者使用了一个拖尾 $ 符号。许多介绍此主题的书籍都一致使用这个约定。如果某些内容出错的话,那么检查示例中的提示。

命令和序列

现在您拥有了一个提示,让我们看看该如何处理它。shell 的主要功能是对您的命令进行解释,这样您就可以与 Linux 系统进行交互。在 Linux(以及 UNIX®)系统中,命令具有一个命令名称,以及选项参数。某些命令既没有选项,也没有参数,而另一些命令可能只具有其中之一。

如果一行代码中包含一个 # 字符,那么该行中的所有其他字符都可以被忽略。因此 # 字符可能表示一个注释以及一个根提示,这可以从上下文中看出来。

Echo

echo 命令将它的参数输出(或回传)到终端,如清单 3 所示。


清单 3. 回传示例
				
[ian@echidna ~]$ echo Word
Word
[ian@echidna ~]$ echo A phrase
A phrase
[ian@echidna ~]$ echo Where     are   my   spaces?
Where are my spaces?
[ian@echidna ~]$ echo "Here     are   my   spaces." # plus comment
Here     are   my   spaces.

在清单 3 的第三个示例中,所有额外的空间都被压缩到输出的单个空间中。为了避免这种情况,需要使用双引号(")或单引号(')将字符串括起。Bash 使用空格,比如空白、制表符和换行符,来将输入行分离到标记(token)中,后者随后被传递给命令。使用引号引用字符串将保留多余的空格并将完整的字符串作为一个单一标记。在上面的示例中,命令名称之后的每一个标记都是一个参数,因此我们具有的参数分别为 1、2、4 和 1。

echo 命令包含两个选项。echo 通常会在输出的末尾加一个拖尾换行符。使用 -n 选项可以禁用这个行为。使用 -e 选项可以使某些反斜杠转义字符具有特殊的含义。其中一些如表 1 所示。


表 1. Echo 和转义字符
转义
序列
作用
\a 警告 (bell)
\b 退格
\c 禁用拖尾换行(与 -n 选项作用相同)
\f 换页(在视频显示中清空屏幕)
\n 换行
\r 回车
\t 水平制表符

转义和续行

在 bash 中使用反斜杠存在一个小问题。当未使用引号引用反斜杠字符(时),将作为一个转义来表示 bash 本身,用于保留以下字符的字面含义。这对于特殊的 shell 元字符是非常必要的,我们将在稍后讨论。这条规则有一个例外:反斜杠后跟一个换行符将致使 bash 合并这两个字符并将字符序列作为一个续行请求处理。这样做可以方便地将比较长的行断开,特别是在 shell 脚本中。

要使用 echo 命令或众多其他使用类似转义控制字符的命令来正确地处理上述字符序列,必须使用引号将转义序列括起,或作为引用字符串的一部分,除非您使用了另一个反斜杠,以使 shell 为命令保留一个反斜杠。清单 4 展示了反斜杠的各种使用示例。


清单 4. 更多 echo 示例
				
[ian@echidna ~]$ echo -n No new line
No new line[ian@echidna ~]$ echo -e "No new line\c"
No new line[ian@echidna ~]$ echo "A line with a typed
> return"
A line with a typed
return
[ian@echidna ~]$ echo -e "A line with an escaped\nreturn"
A line with an escaped
return
[ian@echidna ~]$ echo "A line with an escaped\nreturn but no -e option"
A line with an escaped\nreturn but no -e option
[ian@echidna ~]$ echo -e Doubly escaped\\n\\tmetacharacters
Doubly escaped
        metacharacters
[ian@echidna ~]$ echo Backslash \
> followed by newline \
> serves as line continuation.
Backslash followed by newline serves as line continuation.

注意,bash 在您输入包含不匹配引号的行时显示了一个特殊的 提示 (>)。您的输入字符串继续输入到下一行并包含一个换行符。

Bash shell 元字符和控制操作符(control operator)

Bash 具有多个元字符,这些元字符在未使用引号括起时,可以用来将输入分成多个单词。除了空格以外,这些元字符还包括:

  • |
  • &
  • ;
  • (
  • )
  • <
  • >

我们将在本文的其他部分更详细地讨论其中一些元字符。现在要注意的是,如果您希望包含一个元字符作为文本的一部分,那么必须使用引号括起,或是使用反斜杠 (\) 进行转义,如清单 4 所示。

换行和某些元字符或元字符对也可以用作控制操作符。它们包括:

  • ||
  • &&
  • &
  • ;
  • ;;
  • |
  • (
  • )

其中一些控制操作符允许您创建命令序列列表

最简单的命令序列就是由两个命令组成的、用分号 (;) 分隔的序列。所有命令将按顺序执行。在任何可编程的环境中,命令返回成功或失败的指示;Linux 命令通常返回一个零值表示成功,并返回一个非零值表示失败。可以使用 && 和 || 控制操作符来将某些条件处理引入到列表中。如果使用控制操作符 && 来分隔两个命令,那么只有在第一个命令返回 0 表示退出时,才会执行第二个命令。如果使用 || 分隔命令,那么只有在第一个命令返回一个非零的退出代码时,才会执行第二个命令。清单 5 展示了一些使用 echo 命令的命令序列。这些例子并不怎么令人兴奋,因为 echo 返回了 0,但是当我们使用更多的命令时,您会看到更多例子。


清单 5. 命令序列
				
[ian@echidna ~]$ echo line 1;echo line 2; echo line 3
line 1
line 2
line 3
[ian@echidna ~]$ echo line 1&&echo line 2&&echo line 3
line 1
line 2
line 3
[ian@echidna ~]$ echo line 1||echo line 2; echo line 3
line 1
line 3

退出

您可以使用 exit 命令终止一个 shell。或者可以提供一个 exit 代码作为参数。如果您在图形桌面上的终端窗口中运行 shell,那么窗口将关闭。类似地,如果使用 ssh 或 telnet(举例来说)连接到一个远程系统,那么您的连接将中断。在 bash shell 中,可以同时按下 Ctrl键和 d 键来退出。

让我们查看另一个控制操作符。如果您使用圆括号括起命令或命令列表,那么命令或序列将在一个 sub shell 中执行,因此 exit 命令将退出 sub shell,而不是退出您所在的 shell。清单 6 展示了结合了 && 和 || 以及两个不同的退出代码的示例。


清单 6. Subshell 和序列
				
[ian@echidna ~]$ (echo In subshell; exit 0) && echo OK || echo Bad exit
In subshell
OK
[ian@echidna ~]$ (echo In subshell; exit 4) && echo OK || echo Bad exit
In subshell
Bad exit

本文后面将介绍更多命令序列。

环境变量

当您在 bash shell 中运行时,有许多东西构成了您的环境,比如提示表单、主目录、工作目录、shell 名称、打开的文件、定义的函数,等等。您的环境包括许多由 bash 或您设置的变量。bash shell 还允许您拥有 shell 变量,可以将其导出 到您的环境,以供运行在 shell 中的其他进程或衍生自当前 shell 的其他 shell 使用。

环境变量和 shell 变量都具有一个名称。可以通过在名称前面加一个 “$” 前缀来引用变量的值。表 2 显示了您将经常遇到的一些 bash 环境变量。


表 2. 一些常见 bash 环境变量
名称 作用
USER 已登录用户的名称
UID 用数字表示的已登录用户的用户 id
HOME 用户的主目录
PWD 当前的工作目录
SHELL shell 的名称
$ 进程 id(或运行的 bash shell 或其他进程的 PID
PPID 启动当前进程的进程的 id(即父进程的 id)
? 上一个命令的退出代码

清单 7 展示了这些常见 bash 变量的内容。


清单 7. 环境和 shell 变量
				
[ian@echidna ~]$ echo $USER $UID
ian 500
[ian@echidna ~]$ echo $SHELL $HOME $PWD
/bin/bash /home/ian /home/ian
[ian@echidna ~]$ (exit 0);echo $?;(exit 4);echo $?
0
4
[ian@echidna ~]$ echo $$ $PPID
2559 2558

没有使用 bash?

bash shell 是大多数 Linux 发行版上的默认 shell。如果您没有运行在 bash shell 下,可能需要通过以下几种方式之一来实际使用这个 bash shell。

  • 使用
    chsh -s /bin/bash
    命令来修改您的默认 shell。默认设置将在下一次登录时生效。
  • 使用
    su - $USER -s /bin/bash
    命令创建另一个进程作为当前 shell 的子 shell。新的进程将为使用 bash 的登录 shell。
  • 使用默认的 bash shell 创建一个 id,以用于 LPI 考试准备。

通过输入一个名称并在其后紧接着输入一个等号 (=),您将创建或设置 一个 shell 变量。如果变量存在的话,可以修改它来分配新值。变量需要区分大小写,因此 var1 和 VAR1 表示两个不同的变量。一般来讲,变量(特别是导出的变量)都是大写的,但是这并不是强制要求。理论上来说,$$ 和 $? 属于 shell 参数 而不是变量。它们只能被引用;您不能为它们分配值。

在创建 shell 变量时,您通常需要将其导出 到环境中,这样才可以用于从这个 shell 中启动的其他进程。导出的变量不能 用于父 shell。您使用 export 命令导出变量名。作为 bash 中的一种简单方法,您可以在一个步骤中同时分配值并导出变量。

为了演示分配和导出,让我们在 bash shell 中运行 bash 命令,然后从新的 bash shell 中运行 Korn shell (ksh)。我们将使用 ps 命令显示有关当前运行命令的信息。我们将在本系列的另一篇文章中了解有关 ps 的更多信息(参见 参考资料 获得系列路线图)。


清单 8. 更多环境和 shell 变量
				
[ian@echidna ~]$ ps -p $$ -o "pid ppid cmd"
  PID  PPID CMD
 2559  2558 -bash
[ian@echidna ~]$ bash
[ian@echidna ~]$ ps -p $$ -o "pid ppid cmd"
  PID  PPID CMD
 2811  2559 bash
[ian@echidna ~]$ VAR1=var1
[ian@echidna ~]$ VAR2=var2
[ian@echidna ~]$ export VAR2
[ian@echidna ~]$ export VAR3=var3
[ian@echidna ~]$ echo $VAR1 $VAR2 $VAR3
var1 var2 var3
[ian@echidna ~]$ echo $VAR1 $VAR2 $VAR3 $SHELL
var1 var2 var3 /bin/bash
[ian@echidna ~]$ ksh
$ ps -p $$ -o "pid ppid cmd"
  PID  PPID CMD
 2840  2811 ksh
$ export VAR4=var4
$ echo $VAR1 $VAR2 $VAR3 $VAR4 $SHELL
var2 var3 var4 /bin/bash
$ exit
[ian@echidna ~]$ echo $VAR1 $VAR2 $VAR3 $VAR4 $SHELL
var1 var2 var3 /bin/bash
[ian@echidna ~]$ ps -p $$ -o "pid ppid cmd"
  PID  PPID CMD
 2811  2559 bash
[ian@echidna ~]$ exit
exit
[ian@echidna ~]$ ps -p $$ -o "pid ppid cmd"
  PID  PPID CMD
 2559  2558 -bash
[ian@echidna ~]$ echo $VAR1 $VAR2 $VAR3 $VAR4 $SHELL
/bin/bash

注意:

  1. 在序列的开始部分,bash shell 具有 PID 30576。
  2. 第二个 bash shell 的 PID 为 16353,它的父 shell 的 PID 为 30576,即最初的 bash shell。
  3. 我们在第二个 bash shell 中创建了 VAR1、VAR2 和 VAR3 变量,但是只导出了 VAR2 和 VAR3。
  4. 在 Korn shell 中,我们创建了 VAR4。echo 命令仅显示 VAR2、VAR3 和 VAR4 的值,确认 VAR1 没有被导出。当您看到即使在提示改变的情况下,SHELL 变量的值仍然未变,您是否感到吃惊?您不能始终依赖 SHELL 来获得当前正在运行的 shell,但是 ps 命令的确提供了实际的命令。注意,ps 将一个连字符 (-) 放到第一个 bash shell 的前面,表示这是一个登录 shell
  5. 回到第二个 bash shell 中,我们可以看到 VAR1、VAR2 和 VAR3。
  6. 最后,我们返回到原始 shel,其中并未包含我们的新变量。

前面有关引用的讨论提到您可以使用单引号或双引号。这两者之间有一个重要的区别。shell 将扩展使用双引号 ($quot;) 括起的 shell 变量,而在使用单引号 (') 时不会扩展。在前面的示例中,我们在 shell 中启动了另一个 shell 并且获得一个新的进程 id。使用 -c 选项,您可以将一个命令传递给另一个 shell,后者将执行命令并返回。如果传递一个使用引号括起的字符串作为命令,那么外部 shell 将去掉引号并传递字符串。如果使用的是双引号,那么将在传递字符串之前执行变量扩展,因此产生的结果可能与您期望的不同。shell 和命令将在另一个进程中运行,因此将使用另一个 PID。清单 9 解释了这些概念。顶级 bash shell 的 PID 被突出显示。


清单 9. 引用和 shell 变量
				
[ian@echidna ~]$ echo "$SHELL" '$SHELL' "$$" '$$'
/bin/bash $SHELL 2559 $$
[ian@echidna ~]$ bash -c "echo Expand in parent $$ $PPID"
Expand in parent 2559 2558
[ian@echidna ~]$ bash -c 'echo Expand in child $$ $PPID'
Expand in child 2845 2559
			

目前为止,我们的所有变量引用都使用空格作为结束,因此可以很清楚地显示变量名的终止位置。实际上,变量名可以只包含字母、数字和下划线字符。shell 知道变量名将在出现另一个字符的位置上终止。有时您需要在含义模糊的表达式中使用变量。在这种情况下,可以使用花括号来突出显示命令名,如清单 10 所示。


清单 10. 使用花括号表示变量名
				
[ian@echidna ~]$ echo "-$HOME/abc-"
-/home/ian/abc-
[ian@echidna ~]$ echo "-$HOME_abc-"
--
[ian@echidna ~]$ echo "-${HOME}_abc-"
-/home/ian_abc-

Env

env 在不包含任何选项或参数的情况下将显示当前的环境变量。可以使用它来在定制环境中执行命令。-i(或 -)选项将在运行命令之前清空当前环境,而 -u 选项取消了您不喜欢传递的环境变量。

清单 11 展示了不带任何参数的 env 命令的部分输出,以及在无父环境的情况下调用不同 shell 的三个例子。在我们进行讨论之前请仔细查看它们。

注意:如果系统还没有安装 ksh (Korn) 或 tcsh shell,那么您需要自己动手安装这些 shell。


清单 11. env 命令
				
[ian@echidna ~]$ env
HOSTNAME=echidna
SELINUX_ROLE_REQUESTED=
TERM=xterm
SHELL=/bin/bash
HISTSIZE=1000
SSH_CLIENT=9.27.206.68 1316 22
SELINUX_USE_CURRENT_RANGE=
QTDIR=/usr/lib/qt-3.3
QTINC=/usr/lib/qt-3.3/include
SSH_TTY=/dev/pts/3
USER=ian
...
_=/bin/env
OLDPWD=/etc
[ian@echidna ~]$ env -i bash -c 'echo $SHELL; env'
/bin/bash
PWD=/home/ian
SHLVL=1
_=/bin/env
[ian@echidna ~]$ env -i ksh -c 'echo $SHELL; env'
/bin/sh
_=/bin/env
PWD=/home/ian
_AST_FEATURES=UNIVERSE - ucb
[ian@echidna ~]$ env -i tcsh -c 'echo $SHELL; env'
SHELL: Undefined variable.

注意,bash 设置了 SHELL 变量,但是没有将其导出到环境中,尽管 bash 在环境中创建了另外三个变量。在 ksh 例子中,我们拥有两个变量,但是我们回传 SHELL 变量的值的行为生成了一个空白行。最后,tcsh 并没有创建任何环境变量,并在我们尝试引用 SHELL 的值的时候生成了一个错误。

Unset 和 set

清单 11 展示了 shell 处理变量和环境的各种行为。虽然本文主要关注 bash,但是您最好知道并非所有 shell 都具有相同的行为。此外,shell 将根据它们是否是登录 shell 来做出不同的行为。目前,我们将登录 shell 定义为您在登录到一个系统时获得的 shell;如果愿意的话,您可以启动其他 shell 来作为登录 shell。上面使用 env -i 启动的三个 shell 并不是登录 shell。尝试向 shell 命令本身传递 -l 选项,看看使用登录 shell 会出现什么结果。

现在让我们来尝试在这些非登录 shell 中显示 SHELL 变量的值:

  1. 当 bash 启动后,它将设置 SHELL 变量,但是并不会自动将变量导出到环境。
  2. 当 ksh 启动后,它不会设置 SHELL 变量。然而,引用一个未定义的环境变量相当于引用一个具有空值的变量。
  3. 当 tcsh 启动后,它并不会设置 SHELL 变量。在这种情况下,默认的行为不同于 ksh (以及 bash),因为在我们尝试使用并不存在的变量时,将报告一个错误。

您可以使用 unset 命令来取消一个变量并从 shell 变量列表中移除它。如果变量被导出到环境中,那么将从环境中删除这个变量。可以使用 set 命令来对 bash(或其他 shell)的行为进行许多控制。Set 是一个内置在 shell 中的功能,因此各种选项都是特定于 shell 的。在 bash 中,-u 选项将使 bash 报告一个有关未定义变量的错误,而不是将它们作为已定义的空变量。可以使用 -set 启用各种选项,并使用 + 来关闭选项。可以使用 echo $- 显示当前设置的选项。


清单 12. Unset 和 set
				
[ian@echidna ~]$ echo $-
himBH
[ian@echidna ~]$ echo $VAR1

[ian@echidna ~]$ set -u;echo $-
himuBH
[ian@echidna ~]$ echo $VAR1
-bash: VAR1: unbound variable
[ian@echidna ~]$ VAR1=v1
[ian@echidna ~]$ VAR1=v1;echo $VAR1
v1
[ian@echidna ~]$ unset VAR1;echo $VAR1
-bash: VAR1: unbound variable
[ian@echidna ~]$ set +u;echo $VAR1;echo $-

himBH

如果使用不包含任何选项的 set 命令,它将显示所有 shell 变量及变量值(如果有的话)。还有另一个命令 declare,可以用它创建、导出和现实 shell 变量的值。可以通过手册页研究其他各种 set 选项和 declare 命令。我们稍后将讨论 手册页。

Exec

最后将要介绍的命令是 exec。可以使用 exec 命令来运行将替换当前 shell 的另一个程序。启动 13 启动了一个子 bash shell 并使用 exec 来将它替换为一个 Korn shell。从 Korn shell 退出后,您将回到初始的 bash shell(本例为 PID 2852)中。


清单 13. 使用 exec
				
[ian@echidna ~]$ echo $$
2852
[ian@echidna ~]$ bash
[ian@echidna ~]$ echo $$
5114
[ian@echidna ~]$ exec ksh
$ echo $$
5114
$ exit
[ian@echidna ~]$ echo $$
2852
            

使用 uname 显示系统信息

uname 命令输出有关您的系统及其内核的信息。清单 14 展示了 uname 的各种选项以及生成的信息;每个选项在表 3 中进行了定义。


清单 14. uname 命令
				
[ian@echidna ~]$ uname
Linux
[ian@echidna ~]$ uname -s
Linux
[ian@echidna ~]$ uname -n
echidna.raleigh.ibm.com
[ian@echidna ~]$ uname -r
2.6.29.6-217.2.3.fc11.i686.PAE
[ian@echidna ~]$ uname -v
#1 SMP Wed Jul 29 16:05:22 EDT 2009
[ian@echidna ~]$ uname -m
i686
[ian@echidna ~]$ uname -o
GNU/Linux
[ian@echidna ~]$ uname -a
Linux echidna.raleigh.ibm.com 2.6.29.6-217.2.3.fc11.i686.PAE 
#1 SMP Wed Jul 29 16:05:22 EDT 2009 i686 i686 i386 GNU/Linux

表 3. uname 选项
选项 描述
-s 输出内核名称。如果没有指定任何选项的话,那么这将是默认行为。
-n 输出节点名或主机名。
-r 输出内核的发行版。这个选项常常结合用于模块处理命令。
-v 输出内核的版本。
-m 输出机器的硬件(CPU)名。
-o 输出操作系统名称。
-a 输出以上所有信息。

清单 14 来自运行 Intel® CPU 的 Fedora 11 系统。uname 命令可用于大多数 UNIX® 和类 UNIX 系统以及 Linux。根据所使用的 Linux 发行版和版本以及所运行机器的具体类型,输出的信息也各有差异。清单 15 展示了运行 Ubuntu 9.04 的 AMD Athlon 64 系统的输出。


取得 15. 对其他系统使用 uname
				
ian@attic4:~$ uname -a
Linux attic4 2.6.28-14-generic #47-Ubuntu SMP Sat Jul 25 01:19:55 UTC 2009 x86_64 
GNU/Linux

命令历史

如果您在阅读本文时输入命令,那么可能会注意到经常会多次使用同一个命令,可能输入完全相同的命令,或者是稍微做一些修改。好消息是 bash shell 可以维护一个命令历史。这个功能在默认情况下是启用的。可以使用 set +o history 命令关闭该功能,并使用 set -o history 重新启用。名为 HISTSIZE 的环境变量将指定 bash 需要保持多少行历史。其他一些设置将控制如何控制和管理命令历史。查看 bash 手册页获得完整的信息。

可以用于历史功能的其中一些命令包括:

历史
显示完整历史
历史 N
显示历史中的最后 N
历史 -d N
从历史中删除行 N;比如,如果行中包含密码的话就需要这样做
!!
大部分最近使用的命令
!N
N 个历史命令
!-N
回到历史中的 N 个命令(!-1 相当于 !!)
!#
正在输入的当前命令
!string
string 开头的最近一次命令
!?string?
包含 string 的最近一次命令

可以使用冒号 (:) 后跟某些值来访问或修改历史中的命令。清单 16 显示了一些历史功能。


清单 16. 操作历史
				
[ian@echidna ~]$ echo $$
2852
[ian@echidna ~]$ env -i bash -c 'echo $$'
9649
[ian@echidna ~]$ !!
env -i bash -c 'echo $$'
10073
[ian@echidna ~]$ !ec
echo $$
2852
[ian@echidna ~]$ !en:s/$$/$PPID/
env -i bash -c 'echo $PPID'
2852
[ian@echidna ~]$ history 6
  595  echo $$
  596  env -i bash -c 'echo $$'
  597  env -i bash -c 'echo $$'
  598  echo $$
  599  env -i bash -c 'echo $PPID'
  600  history 6
[ian@echidna ~]$ history -d598
			

清单 16 中的命令完成以下操作:

  1. 回传当前 shell 的 PID
  2. 在新 shell 中运行一个 echo 命令并回传该 shell 的 PID
  3. 重新运行最后一个命令
  4. 重新运行以 ‘ec’ 开头的最后一个命令;在本例中将返回第一个命令
  5. 重新运行以 ‘en’ 开头的最后一个命令,但是使用 ‘$PPID’ 替换 ‘$$’,这样将显示父 PID
  6. 显示历史中的最后 6 个命令
  7. 删除历史条目 598,即最后一个 echo 命令

还可以交互式地编辑历史。bash shell 使用 readline 历史来管理命令编辑和历史。默认情况下,用于在历史中移动并编辑行的键和键组合类似于 GNU Emacs 编辑器中使用的相应内容。Emacs 按键组合常常被表示为 C-xM-x,其中 x 为常规键,而 CM 分别为 ControlMeta 键。在一个典型 PC 系统中,Ctrl 键充当 Emacs Control 键,而 Alt 键充当 Meta 键。表 3 总结了一些可用的历史编辑功能。除了表 3 所示的键组合外,鼠标移动键,比如上、下、左、右,以及 Home 和 End 键都通常被设置为以逻辑方式工作。其余功能以及如何使用 readline init 文件(通常为主目录中的 inputrc)定制选项等内容可以在手册页中找到。


表 3. 使用 emacs 命令编辑历史
命令 常用 PC 键 说明
C-f 右箭头 向右移动一个空格
C-b 左箭头 向左移动一个空格
C-p 向上箭头 将命令移动到命令历史的前面
C-n 向下箭头 将命令移动到命令历史的后面
C-r   增量反向搜索。输入一个或多个字符以向后搜索某个字符串。再次按下 C-r 以搜索同一字符串在历史中下一次出现的位置。
M-f Alt-f 移动到下一单词的开始部分;GUI 环境常常使用这个键组合来打开窗口的 File 菜单
M-b Alt-b 移动到前一个字符的开始部分
C-a Home 移动到行首
C-e End 移动到行尾
Backspace Backspace 删除游标前面的字符
C-d Del 删除游标以后的字符(Del 和 Backspace 功能可能被配置为相反的含义)
C-k Ctrl-k 删除到行末,并保存被删除的文本供以后使用
M-d Alt-d 删除到单词末尾,并保存被删除的文本供以后使用
C-y Ctrl-y 恢复使用 kell 命令删除的文本

如果喜欢用 vi 类的编辑模式操作历史,那么使用 set -o vi 命令来切换到 vi 模式。使用 set -o emacs 切换回 emacs 模式。当在 vi 模式下检索到一个命令后,您最初将位于 vi 的 insert 模式。vi 编辑器将在本系列另一篇文章中介绍(参见 参考资料 获得系列路线图)。

路径 - 我的命令在哪里?

一些 bash 命令都是内置的,而另一些则来自外部。让我们探讨一下外部命令以及如何运行它们,以及如何判断某个命令是否是内部的。

shell 如何查找命令?

外部命令就是指文件系统中的文件。基本命令管理将在本系列另一篇文章中介绍(参见 参考资料 获得系列路线图)。在 Linux 和 UNIX 系统上,所有文件都作为一个大型树的其中一部分访问,这个树的根为 /。在我们的示例中,我们的当前目录目前为止一直都是用户的主目录。非根用户常常在 /home 目录中有一个主目录,比如这里的主目录为 /home/ian。根用户的主目录通常为 /root。如果输入一个命令名,那么 bash 将在您的路径(path)中查找该命令,路径就是指 PATH 环境变量中以冒号分隔的目录列表。

如果您希望知道在输入特定字符串后将执行哪个命令,那么使用 whichtype 命令。清单 17 展示了我的默认路径以及多个命令的位置。


清单 17. 找到命令位置
				
[ian@echidna ~]$ echo $PATH
/usr/lib/qt-3.3/bin:/usr/kerberos/bin:/usr/lib/ccache:/usr/local/bin:/bin:/usr/b
in:/home/ian/bin
[ian@echidna ~]$ which bash env zip xclock echo set ls
alias ls='ls --color=auto'
        /bin/ls
/bin/bash
/bin/env
/usr/bin/zip
/usr/bin/xclock
/bin/echo
/usr/bin/which: no set in (/usr/lib/qt-3.3/bin:/usr/kerberos/bin:/usr/lib/ccache
:/usr/local/bin:/bin:/usr/bin:/home/ian/bin)
[ian@echidna ~]$ type bash env zip xclock echo set ls
bash is hashed (/bin/bash)
env is hashed (/bin/env)
zip is /usr/bin/zip
xclock is /usr/bin/xclock
echo is a shell builtin
set is a shell builtin
ls is aliased to `ls --color=auto'

注意,路径中的目录大部分以 /bin 结束。这是一个常见的习惯,但是正如 /usr/lib/ccache 一样,不是必须要求。which 命令报告指出,ls 命令是一个别名(alias)并且无法找到 set 命令。在这种情况下,我们将其解释为不存在或是一个内置命令。type 命令报告指出,ls 命令是一个别名,但是它将 set 命令标识为一个 shell 内置命令。它还报告说有一个内置的 echo 命令以及由 which 发现的位于 /bin 的命令。命令还将按照不同的顺序生成输出。

我们看到,用于列出目录内容的 ls 命令是一个别名。别名可以方便地配置一些命令以使用不同的默认值,或为某个命令提供可替换的名称。在我们的示例中,--color=tty 选项可以根据文件或目录的类型用不同的颜色编码目录清单。尝试运行 dircolors --print-database,看看如何控制不同颜色的编码以及将哪些颜色用于哪类文件中。

每个命令都提供有额外的选项。根据您的具体需求,可以使用任何一个命令。当我确信我将找到一个可执行文件并且只需要它的完整路径说明时,我将使用 which。我发现 type 为我提供了更准确的信息,我需要在某个 shell 脚本中使用到。

运行其他命令

我们在清单 17 中看到,可执行文件拥有一个以 /根目录开头的完整路径。例如,xclock 程序的路径为 /usr/bin/xclock,即位于 /usr/bin 目录下的一个文件。在较旧的系统上,您可能会发现该文件位于 /usr/X11R6/bin 目录。如果命令没有出现在 PATH 说明中,那么可能仍然需要通过指定一个路径和一个命令名来运行它。您可以使用两种类型的路径:

  • 绝对 路径指那些以 / 开头的路径,比如我们在清单 17 中看到的路径(/bin/bash、/bin/env 等等)。
  • 相对 路径指的是相对于您的当前工作目录 的路径,正如 pwd 命令报告的那样。这些命令不是以 / 开头,但是至少包含了一个 /。

不管您的当前工作路径是什么,您都可以使用绝对路径,但是只有在一个命令接近当前目录时,才有可能使用相对路径。假设您在名为 mytestbin 的主目录的子目录中开发经典的 “Hello World!” 程序的新版本。您可能需要使用相对路径来以 mytestbin/hello 形式运行命令。您可以在路径中使用两种特殊名称;使用一个圆点 (.) 表示当前目录,使用一对圆点 (..) 表示当前目录的子目录。由于您的主目录通常并不在(通常来讲也不应该在)PATH 中,因此需要显式地为您希望从主目录中运行的任何可执行文件提供一个路径。例如,如果在主目录中有一个 hello 程序的副本,那么可以使用 ./hello 命令运行它。可以使用 . 和 .. 作为绝对路径的一部分,尽管单个 . 在这种情形下并不是特别有用。您还可以使用一个波浪符号 (~) 来表示自己的主目录,并使用 ~用户名 表示名为 username 的用户的主目录。清单 18 展示了一些示例。


清单 18. 绝对和相对路径
				
[ian@echidna ~]$ /bin/echo Use echo command rather than builtin
Use echo command rather than builtin
[ian@echidna ~]$ /usr/../bin/echo Include parent dir in path
Include parent dir in path
[ian@echidna ~]$ /bin/././echo Add a couple of useless path components
Add a couple of useless path components
[ian@echidna ~]$ pwd # See where we are
/home/ian
[ian@echidna ~]$ ../../bin/echo Use a relative path to echo
Use a relative path to echo
[ian@echidna ~]$ myprogs/hello # Use a relative path with no dots
-bash: myprogs/hello: No such file or directory
[ian@echidna ~]$ mytestbin/hello # Use a relative path with no dots
Hello world!
[ian@echidna ~]$ ./hello
Hello world!
[ian@echidna ~]$ ~/mytestbin/hello # run hello using ~
Hello world!
[ian@echidna ~]$ ../hello # Try running hello from parent
-bash: ../hello: No such file or directory

切换工作目录

正如您可以从系统的不同目录中执行程序一样,您也可以使用 cd 命令来切换当前工作目录。cd 的参数必须是一个目录的绝对或相对路径。对于命令,您可以在路径中使用 .、..、~ 和 ~username。如果 cd 不使用任何参数,那么将切换到您的主目录。将一个连字符 (-) 作为参数意味着切换到前一个工作目录。您的主目录存储在 HOME 环境变量,而前一个目录存储在 OLDPWD 变量,因此 cd 相当于 cd $HOME,而 cd - 相当于 cd $OLDPWD。通常我们使用 change directory 指代 change current working directory

对于命令,还包括一个环境变量 CDPATH,它包含在解析相对路径时执行搜索的以冒号分隔的目录集合(除了当前工作目录外)。如果解析使用了来自 CDPATH 的路径,那么 cd 将输出结果目录的完整路径。通常,成功的目录切换将不会产生输出,只会产生一个新的、很可能更改过的提示。清单 19 显示了一些示例。


清单 19. 切换目录
				
[ian@echidna ~]$ cd /;pwd
/
[ian@echidna /]$ cd /usr/local;pwd
/usr/local
[ian@echidna local]$ cd ;pwd
/home/ian
[ian@echidna ~]$ cd -;pwd
/usr/local
/usr/local
[ian@echidna local]$ cd ~ian/..;pwd
/home
[ian@echidna home]$ cd ~;pwd
/home/ian
[ian@echidna ~]$ export CDPATH=~
[ian@echidna ~]$ cd /;pwd
/
[ian@echidna /]$ cd mytestbin
/home/ian/mytestbin

手册页

本文讨论的最后一个话题就是教您如何通过手册页以及其他来源获得有关 Linux 命令的文档。

手册页和章节

文档的主要(和传统)来源就是手册页,您可以通过 man 命令访问。图 1 解释了 man 命令的手册页。使用命令 man man 显示这些信息。


图 1. man 命令的手册页

图 1 展示了手册页中的典型内容项:

  • 一个标题,命令名后是使用圆括号括起的章节号
  • 命令名以及同一手册页中描述的相关命令的名称
  • 可用于该命令的选项和参数的摘要
  • 命令的简短描述
  • 有关每个选项的详细信息

您可能会找到有关使用、如何报告 bug、作者信息以及相关命令列表的章节。例如,man 的手册页告诉我们,相关的命令(以及手册页章节)为:

apropos(1)、whatis(1)、less(1)、groff(1) 和 man.conf(5)。

共有 8 个常见手册页章节。手册页通常在您安装包时进行安装,因此如果您没有安装包的话,您很可能并不具备手册页。某些手册页章节可能是空的,或几乎是空的。包含示例内容的常见手册页章节包括:

  1. 用户命令(env、ls、echo、mkdir、tty)
  2. 系统调用或内核函数(link、sethostname、mkdir)
  3. 库例程(acosh、asctime、btree、locale、XML::Parser)
  4. 与设备相关的信息(isdn_audio、mouse、tty、zero)
  5. 文件格式描述(keymaps、motd、wvdial.conf)
  6. 游戏(注意,许多游戏现在都是图形化的,并且在手册页系统之外提供了图形化帮助)
  7. 杂项(arp、boot、regex、unix utf8)
  8. 系统管理(debugfs、fdisk、fsck、mount、renice、rpm)

其他章节可能包括:9 表示 Linux 内核文档、n 表示新文档、o 表示旧文档,l 表示本地文档。

某些条目出现在多个章节中。在我们的例子中,mkdir 出现在章节 1 和 2 中,而 tty 出现在章节 1 和 4 中。您可以指定一个特定的章节,例如,man 4 ttyman 2 mkdir,或者可以指定 -a 选项来列出所有合适的手册章节。

您可能已经注意到,图中的 man 为您提供了许多选项。现在,让我们快速了解一下 “另外参见” 部分与 man 有关的一些命令。

另外参见

man 有关的两个重要的命令分别为 whatisaproposwhatis 命令在手册页中寻找您指定的名称,并从合适的手册页中显示名称信息。apropos 命令对手册页执行关键字搜索,并列出包含您的关键字的命令。清单 20 解释了这些命令。


清单 20. Whatis 和 apropos 示例
				
[ian@echidna ~]$ whatis man
man []               (1)  - format and display the on-line manual pages
man []               (1p)  - display system documentation
man []               (7)  - macros to format man pages
man []               (7)  - pages - conventions for writing Linux man pages
man.config []        (5)  - configuration data for man
man-pages           (rpm) - Man (manual) pages from the Linux Documentation Project
man                 (rpm) - A set of documentation tools: man, apropos and whatis
[ian@echidna ~]$ whatis mkdir
mkdir []             (1)  - make directories
mkdir []             (1p)  - make directories
mkdir []             (2)  - create a directory
mkdir []             (3p)  - make a directory
[ian@echidna ~]$ apropos mkdir
mkdir []             (1)  - make directories
mkdir []             (1p)  - make directories
mkdir []             (2)  - create a directory
mkdir []             (3p)  - make a directory
mkdirat []           (2)  - create a directory relative to a directory file descriptor
mkdirhier []         (1)  - makes a directory hierarchy

顺便提一下,如果无法在手册页中找到 man.conf,那么尝试运行 man man.config

man 命令通过一个分页程序将输出分页到显示中。在大多数 Linux 系统中,很可能使用的是 less 程序。另一个选择是使用较旧的 more 程序。如果希望输出页面,那么指定 -t o选项来格式化页面,以使用 grofftroff 程序执行输出。

less 分页器包含多个命令,可以帮助您在显示的输出中搜索字符串。使用 man less 查找更多关于 /(向前搜索)、?(向后搜索)和 n(重复最后一次搜索)以及其他许多命令的信息。

 

 

 

To comment, click below to log in.


 

Click to cancel reply

或是留下您的資料:

名稱 (必要)
Email (不會公開) (必要)
網址

 
 
 
     
Type the two words: Type what you hear: Incorrect. Try again.
   
   

<!--

XHTML: You can use these tags: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

-->

 

給程式設計師的Vim入門圖解說明

December 8th, 2009 by vgod <!-- | 瀏覽:106,910 -->
推到Plurk

12-09 Update: The English version of Vim Visual Cheat Sheet is also available. PNG, PDF)

(更新: 在圖內加入基本指令表和說明以及PDF版,方便大家列印出來貼在牆上隨時查看。)

剛在寫那篇關於vi和文字編輯器的文章時,本來想附上一個vim的超簡單入門連結,但找了一下都沒有很滿意的,所以決定自己動手先來畫個入門用的說明圖。


PDF版下載

這個圖把vim中基本的移動方法都畫上去了,為了方便programmer,特別列出了很多只有寫程式才會用的按鍵。除了這些以外,其實還有一些好用的東西我還沒想到怎麼畫上去比較好(像是tags、沒有標準快速鍵的tab、man..),如果大家有idea歡迎提供。

這些圖示依照移動的單位大小分為以下幾個種類,分別用不同顏色標示:
(注意,這不是完整的vim快速鍵列表,只是我覺得比較常用的鍵而已。)

字元(character)
h
j
k
l
單字(word)
w
下一個word
W
下一個word(跳過標點符號)
b
前一個word
e
跳到目前word的尾端
行(line)
0
跳到目前行的開頭
^
跳到目前行第一個非空白字元
$
跳到行尾
段落(paragraph)、區塊(block)
{
上一段(以空白行分隔)
}
下一段(以空白行分隔)
[{
跳到目前區塊開頭
]}
跳到目前區塊結尾
%
跳到目前對應的括號上(適用各種括號,有設定好的話連HTML tag都能跳)
螢幕(screen)、絕對位置
H
螢幕頂端
M
螢幕中間
L
螢幕底部
: x
xG
跳到第x行(x是行號)
搜尋(search)
/xxxx
搜尋xxxx
#
往前搜尋目前游標所在的字(word)
*
往後搜尋目前游標所在的字(word)
f x
在目前行往後搜尋字元x
gd
跳到目前游標所在的字(word)的定義位置(寫程式用, 跳到定義變數/函式的地方)
分割視窗
:split
分割視窗(可加檔名順便開啟另一檔案)
:diffsplit xxx
以分割視窗和檔案xxx做比較(diff)
Ctrl-W p
跳到前一個分割視窗(在兩個分割窗來回切換)
Ctrl-W j
跳到下面的分割窗
Ctrl-W h
跳到左邊的分割窗
Ctrl-W k
跳到上面的分割窗
Ctrl-W l
跳到右邊的分割窗
自動補齊(Auto-completion) (在Insert Mode中使用)
Ctrl-N
自動補齊檔案內的下一個可能字(word)
Ctrl-P
自動補齊檔案內的上一個可能字(word)
Ctrl-X Ctrl-F
自動補齊檔名

“給程式設計師的Vim入門圖解說明” 有65則留言

  1. Tweets that mention 給程式設計師的Vim入門圖解說明 | vgod’s blog -- Topsy.com 說:

    [...] This post was mentioned on Twitter by Tsung-Hsiang Chang, MacTalks. MacTalks said: 給程式設計師的Vim入門圖解說明 http://ff.im/-cyVEG [...]

  2. walkingice 說:

    因為使用寬螢幕的關係,分割視窗個人偏好使用 :vsp (vertical split)

    - 回覆留言(Reply)

    Cornelius Reply:

    C-w v 就可以少打兩個字元了 :-) )

    - 回覆留言(Reply)

  3. vincicat 說:

    呃….其實vim最應該強調的是最基本的操作,因為和一般的editor差太大 (不論GUI還是console的)

    一般模式
    esc (切入/離開命令模式, save/quit都要在命令模式做…)
    i (進入輸入模式[Insert mode],不然沒法打字…)

    命令模式
    :w (save)
    :q (end program)
    :u (undo)

    Find, replace, copy & paste都有特殊按鍵…方法有幾個,不詳述了

    - 回覆留言(Reply)

    vgod Reply:

    這張圖以游標移動為主,基本操作應該要另外畫一張圖了 :p

    - 回覆留言(Reply)

    vgod Reply:

    我後來把基本命令也加到圖中了, 感謝你的意見

    - 回覆留言(Reply)

  4. zxjllyyin 說:

    请问vgod,用的是什么绘图工具,这张图表做的很好看.

    - 回覆留言(Reply)

    vgod Reply:

    我用Mac上的OmniGraffle畫的。

    - 回覆留言(Reply)

  5. Gocrazy 說:

    可不可以順便請版主介紹一下 常用的vim plug-in
    例如寫java時常用的
    Mac上Eclipse好慢阿~

    - 回覆留言(Reply)

    Cornelius Reply:

    java 的 plugin 很多
    像是

    javabrowser – Shows java file class, package in a tree as in IDEs. Java source browser.

    editjava – lookup source file for classname under cursor

    java-apidoc.vim – Java API documentation viewer (JavaDoc)

    javacomplete – Omni Completion for JAVA

    - 回覆留言(Reply)

  6. $4 說:

    Cool Stuff~ :D
    BTW, c9s 有弄一個 vim-taiwan 的討論區有興趣的朋友可以來交流 :)
    http://groups.google.com/group/vim-taiwan

    - 回覆留言(Reply)

  7. vim rocks 說:

    漏掉 gg=G 阿阿阿阿阿

    - 回覆留言(Reply)

    vgod Reply:

    剛又更新了一次,把gg和G加進去了。
    其實我也蠻想放=的,但似乎沒地方塞了orz..

    - 回覆留言(Reply)

  8. dryman 說:

    將編刪指令加上動作,如d3w就是刪除三個字
    使用者可以隨意組合~

    補充:ctrl-w H/J/K/L會將目前的視窗弄到最左/下/上/右
    而且會盡量變成最大化,這個功能也蠻好用的

    ctrl-W o 將目前視窗唯一化
    ctrl-w ctrl-w跳到下一個視窗

    - 回覆留言(Reply)

    vgod Reply:

    好用指令真是太多了 要塞在小小的表中真是困難呀orz..

    - 回覆留言(Reply)

  9. dryman 說:

    有個command我覺得最重要
    就是用ctrl-[ 來取代esc,這樣手指就不用離開鍵盤中央
    我覺得這樣對於使用normal mode的意願會增加
    而不是在insert mode慢慢地移動上下左右鍵

    - 回覆留言(Reply)

    vgod Reply:

    的確, 我把這個鍵也加到圖上了:)

    - 回覆留言(Reply)

  10. Charlie Brown 說:

    您好!我想學習 使用vi編輯器,來撰寫程式~
    我以前都是使用IDE開發平台,像是Visual Studio, XCode,以及其他的Ultraedit等等

    很久以前就聽說vi很好用~但是,一直沒有機會可以踏入
    想了解一下,大家都用vi開發什麼類型的程式呢?如“視窗程式(任何平台)“ “手機程式(任何平台)“ “網頁(這個我有看過)“

    在IDE有許多東西都會幫你準備好,所以如果我換vi的話,我是否都要將IDE準備好的東西,寫成template等等之類的

    不好意思,問題有點亂!感謝大家@@“

    - 回覆留言(Reply)

    vgod Reply:

    我用vim寫*所有*的程式。

    我不確定你說的IDE幫你準備好的東西包括什麼,如果只是一些code template,那的確就自己先寫一份就行了。比較難轉換的是compile, deploy這種事,通常還要順便學個make、ant之類的工具才行。當然不想研究這些的話,也可以呼叫原本IDE的command指令來做這些事,或是乾脆用IDE裡面的vi plugin。但我個人推薦自己寫makefile就是了,這樣可以順便了解IDE底下到底做了什麼事,如果有特殊需求也方便自己動手做而不用在IDE裡找設定找半天。

    - 回覆留言(Reply)

    Charlie Brown Reply:

    恩!我了解了!我也來踏入vi的領域!
    基本上,我也想了解ㄧ下哪個方向是比較好的,像是您說

    “自己寫makefile就是了,這樣可以順便了解IDE底下到底做了什麼事,如果有特殊需求也方便自己動手做而不用在IDE裡找設定找半天“

    表示從這個方像去學習可以了解更多的東西是不錯的

    非常感謝您!

    - 回覆留言(Reply)

  11. dryman 說:

    基本上各種程式都可以開發啊XD
    最近在籌劃在Ptt開一個Editor版,主要用來討論vim和emacs
    歡迎前來捧場:)

    - 回覆留言(Reply)

    vgod Reply:

    期待開板:)

    - 回覆留言(Reply)

    Charlie Brown Reply:

    我會常過去的!
    謝謝您!

    - 回覆留言(Reply)

    dryman Reply:

    結果連署完成兩個禮拜了Editor版都還沒開成… so sad
    目前只能等了(已寄信催了,卻沒有回覆)
    如果開好了還望大家多多捧場 :)

    - 回覆留言(Reply)

  12. PowerOp 說:

    這應該要來個英文版的!

    - 回覆留言(Reply)

    vgod Reply:

    其實已經做了:p

    - 回覆留言(Reply)

  13. [UNIX] Vim 命令圖解說明 | 小惡魔 - 電腦技術 - 生活日記 - 美食介紹 - AppleBOY 說:

    [...] Windows 或者是 UNIX 系統上面非常強大的編輯器,在 vgod’s blog 看到一篇:『給程式設計師的Vim入門圖解說明』,原作者提供了 pdf 以及 png [...]

  14. 早起 說:

    很棒的教程~~

    - 回覆留言(Reply)

  15. Azone’s Blog » 给程序员的Vim入门图解说明 說:

    [...] 文章来源:http://blog.vgod.tw/2009/12/08/vim-cheat-sheet-for-programmers/ 发表评论 | Trackback 目前还没有任何评论. [...]

  16. bolo 說:

    很有用,谢谢分享了

    - 回覆留言(Reply)

  17. 邱焜 說:

    是个好东西,现bookmark了

    - 回覆留言(Reply)

  18. pangpig的记录集 » Blog Archive 說:

    [...] 命令图解包括中文和英文版,并提供 PNG 及 PDF 格式,可从 vgod’s blog 下载。 This entry was posted on , 2009年12月25日 at 12:55 上午 and is filed under Linux. [...]

  19. yehchge 說:

    你好,看到你這篇文章後,讓我開始想要學習Vim, 所以我就到網站上
    下載了Vim 7.2 for windowsXp的版本回來,再學習的過程中, 使用
    Ctags和TagList的套件時,發現如果文件在有中文的路徑下使用TagList
    會發生個錯誤:
    Taglist: Failed to generate tags for C:\Documents and Settings\yehchge\桌面\test.php
    ………. 的錯誤, 上網 Google了好久,好像都沒有解決的方法,
    好像在解析中文路徑的時候,會出現這樣的問題,不知是否有解決的方法?? 謝謝!

    - 回覆留言(Reply)

  20. roga's blog » 我目前使用的 .vimrc 設定檔 說:

    [...] vim – 很多進階的用法,作者對 vim 非常熟稔,也寫了很多很棒的文章。 給程式設計師的Vim入門圖解說明 – 這陣子推薦非常多人看。 vi / vim 圖解鍵盤指令 – [...]

  21. glynn 說:

    有三個我常用的command是

    自動內縮
    set autoindent

    用空格取代tab
    set expandtab

    和滑鼠整合(可是在mac下沒辦法和touchpad整合…)
    set mouse=a

    - 回覆留言(Reply)

  22. shalock 說:

    o 在游標下方插入一空白行並進入insert mode

    這個也蠻好用的

    - 回覆留言(Reply)

  23. 常用Vim操作命令集合 - 不名一格 說:

    [...] Vim常用操作命令-1-移动:h/j/k/l: 左/下/上/右 移一格w : 向后词移动 (前面加数字移动多少个词)b : 向前词移动 (前面加数字移动多少个词)e : 向后移到词末ge : 向前移到词末$ : 行末0 : 行首tx : 向右查找本行的x并移到那儿(大写时向左)33G : 移到文件的第33行 *G = shift+ggg : 文件首行G : 文件尾行33% : 文件的33%处H/M/L : 屏幕的首/中/尾行zt/zz/zb : 当前行移到屏幕的首/中/底部-2-跳转:” : 回到跳转来的地方CTRL-O : 跳到一个 “较老” 的地方CTRL-I : 则跳到一个 “较新” 的地方-3-查找:/ : 向下查找(后加关键字)? : 向上查找(后加关键字)n : 下一条符合的记录-4-编辑:i : 转换到插入模式x : 删除当前字符. : 重复最后一次的修改操作(同PS里ctrl+f执行滤镜)u : 撤销操作CTRL-R : 重做p : 将删除的字符插入到当前位置(put)-5-保持退出操作::q : 退出:q! : 不保存退出ZZ : 保存后退出:e! : 放弃修改重新编辑Vim命令壁纸两张适合于初学者的VIM命令图解:原文:给程式设计师的Vim入门图解说明下面这张壁纸也是不错的东东: [...]

  24. andy 說:

    請問一下,vim有自動生成程式碼的功能嗎?因為目前寫一些類別其部分程式碼都是固定的,但卻不知道如何著手…..

    - 回覆留言(Reply)

  25. est 說:

    This is coo; :D

    - 回覆留言(Reply)

  26. 转 : 2010 Ruby on Rails 書單 與 練習作業 – Refactoring Thoughts 說:

    [...] 的 給程式設計師的Vim入門圖解說明 [...]

  27. raincole 說:

    學長你好,我是一中的學弟。
    我想請問一下用vim處理數百行以上的程式時,有沒有什麼技巧呢?
    因為我總覺得程式稍微長一點,vim就變得比較難操作…
    例如雖然我可以用d3d刪除三行,可是如果我要刪除25行這麼多,還得去數/去算到底是多少行…
    行還有行號可以看,如果要操作的是字元就頭昏眼花了@@
    我也試著按v把要操作的部份選起來,但是用鍵盤來選取也不太方便…
    另外vim的折疊功能我也不太會操作,到底要怎麼指定他把一整段{}或()內的折起來呢?

    對了,其實這篇回應的重點是,學長你今年暑假可以回來開鍋嗎XDD
    (我是現任電研社長~)

    - 回覆留言(Reply)

  28. Next Step... 說:

    Vim – 1…

  29. Vim 小抄 與 入門投影片 | TechNow 當代科技 說:

    [...] 入門的 cheatsheet 於 “給程式設計師的Vim入門圖解說明” [...]

  30. alice 說:

    我是因為要學vim才搭上你的部落格的喔,
    果然vim都是高手在用的編輯器,希望我現在學還不算太晚。但
    就算有點晚,至少還是給我遇到了.

    - 回覆留言(Reply)

  31. VIM教程与学习资料汇总(2010-02-19更新) | 善用佳软 說:

    [...]   用心绘制了Vim入门图解说明(如能改为浅色就更便于打印了),较直观地解释了Vim模式的概念、更多见 [...]

  32. 转 : 2010 Ruby on Rails 書單 與 練習作業 | Refactoring Thoughts 說:

    [...] 的 給程式設計師的Vim入門圖解說明 [...]

  33. camry 說:

    http://blog.csdn.net/camry_camry/archive/2004/09/23/114188.aspx
    我写的 vim 使用经验(简体的),希望交流 :)

    - 回覆留言(Reply)

  34. VIM教程与学习资料汇总 | 追随我心 說:

    [...] 用心绘制了Vim 入门图解说明(如能改为浅色就更便于打印了),较直观地解释了Vim模式的概念、更多见 [...]

  35. links for 2010-11-03 | Midashuang's Blog 說:

    [...] 給程式設計師的Vim入門圖解說明 | vgod’s blog (tags: vim linux editor) [...]

  36. Vim 命令图解 | Linux爱好者 說:

    [...] 命令图解包括中文和英文版,并提供 PNG 及 PDF 格式,可从 vgod’s blog [...]

  37. 常用Vim操作命令集合 | 成都网站建设 說:

    [...] 最后奉上VIM命令壁纸两张 原文链接 给程式设计师的Vim入门图解说明 [...]

  38. 学习VIM(教程汇总) | AABC博客 說:

    [...] 用心绘制了Vim入门图解说明(如能改为浅色就更便于打印了),较直观地解释了Vim模式的概念、更多见 [...]

  39. VIM教程与学习资料汇总-web调色板|学习web知识,调出精彩web人生 說:

    [...] 用心绘制了Vim入门图解说明(如能改为浅色就更便于打印了),较直观地解释了Vim模式的概念、更多见 [...]

  40. VIM教程与学习资料汇总 | Goto-Linux 說:

    [...] 用心绘制了Vim入门图解说明(如能改为浅色就更便于打印了),较直观地解释了Vim模式的概念、更多见 [...]

  41. 分享我的vim設定檔 | vgod's blog 說:

    [...] 最近開始從純文字的vim轉移到有GUI的MacVim,才發現我已經用了15年的vim設定檔不知不覺變得又亂又肥。有一大堆plugin都是放進去就忘記了,或是當初為了解決vim 5.x或6.x的問題,到了vim7後都變成多餘的垃圾。vim這種歷久彌新的編輯器,特點就是客製化功能特別強,每個人都有不同的快速鍵設定或偏好的plugin,但用了十幾年後,我發現真正重要和常用的功能還是那些基本的編輯功能:輸入、移動、複製、剪下、貼上、搜尋、視窗/檔案/分頁切換。(也就是我在給程式設計師的Vim入門圖解說明中畫的那些)其他很多看似很酷的plugin,常常一開始看到覺得很有趣,但裝進去因為很少會用到,時間久了也就忘記它的存在。 [...]

  42. Vim 相關網頁資訊 | Input and Output 說:

    [...] vgod所作的Vim海報:給程式設計師的Vim入門圖解說明 圖檔 [...]

  43. links for 2011-04-07 at iLenceel 說:

    [...] 給程式設計師的Vim入門圖解說明 I like that! [...]

  44. 心博 » VIM教程与学习资料汇总[转自:善用佳软] 說:

    [...]   用心绘制了Vim入门图解说明(如能改为浅色就更便于打印了),较直观地解释了Vim模式的概念、更多见 [...]

  45. 相信Vim新手会喜欢的![Ubuntu文档编辑] | UbuntuSoft 說:

    [...] 英文版、英文PDF版请到原地址下载:給程式設計師的Vim入門圖解說明 [...]

  46. Vim操作图示 | 在路上[On Road,Walk Hard!] 說:

    [...] 原文更经典:http://blog.vgod.tw/2009/12/08/vim-cheat-sheet-for-programmers/ [...]

  47. Blog.XDite.net » 2010 Ruby on Rails 書單 與 練習作業 說:

    [...] 的 給程式設計師的Vim入門圖解說明 [...]

  48. 常用Vim操作命令集合 | I'M YIN 說:

    [...] 适合于初学者的VIM命令图解:原文:给程式设计师的Vim入门图解说明 [...]

  49. Geo 說:

    以vi 新人角度
    shift + 方向鍵下
    跳下頁
    shift + 方向鍵上
    跳上頁

    會比較好記0…0

    - 回覆留言(Reply)

  50. 我的vim環境設定 | Jui-Chi Ricky Liang's Blog 說:

    [...] *註2:關於vim的其它操作,可以看vim本身的help,或是vgod所提供的vim cheat sheet。 [...]

  51. [转] Vim入门图解说明. 說:

    [...] 来源:http://blog.vgod.tw/2009/12/08/vim-cheat-sheet-for-programmers/ [...]

留下您的意見

 

这是一段在Makefile中常见的规则

clean:

rm -r core *.o *.a tmp_make

for i in *.c; do rm -f `basename $$i .c`.s; done

(cd chr_drv; make clean)

(cd blk_drv; make clean)

(cd math; make clean)

第一句的 rm -f core *. *.a tmp_make 作用只是删除文件,意思直白,没什么好说的。

第二句 for 循环遍历目录下所有的文件,将所有后缀名为.c文件名依次赋给i。然后执行do语句,当符合循环结束是执行done。可以说这里的for和shell里for语法是如此貌似。

我们可以来做个实验来验证一下:

$ mkdir test #建立个实验用的目录

$ cd test

$ touch a.x #建几个实验用的文件

$ touch b.x

$ touch yy.x

$ vi Makefile #写个实验脚本

在文件中写入:

clean:

for i in *.x; do echo $$i; done

写好后,保存退出。运行命令:

$ make

随后可看到输出的结果:

for i in *.x;do echo $i;done

a.x

b.x

yy.x

看到结果,for语句实现的功能就很清楚了。

对于结果,有一个怪异的就是,原来脚本中的$$i,在输出是就变成了$i。这时的for是不是就是一样了。现在可以先做个结论,make处理脚本可shell处理脚本几乎雷同,只是个别情况下要做变通。make会对$x进行扩展。比如:

ec=echo

test:

$(ec) 'ddd'

就可以在屏幕上看到输出:

echo 'ddd'

ddd

所以应该是make对Makefile进行处理,将其变成shell可执行的脚本,最后由shell解释器来执行有make翻译过的脚本。并且是翻译一句然后shell执行一句,对于这个可以再做个验证。

e =echo

prt=ls

clean:

$(prt)

for i in *.x;do $e $$i;done

其输出为:

ls

a.sh a.x b.x Makefile yy.x

for i in *.x;do echo $i;done

a.x

b.x

yy.x

可以看到,$(prt)被扩展后就立即执行了。后面的for也是这样。

到这里开篇的那个例子算是解析完毕了。下面在看看Makefile中的规则定义,在make中的规则分为两种,一种是显示规则,另一种无可争议的就是隐含规则了。

显示规则,定义如下

目标文件 : 依赖文件

生成目标文件的规则

隐含规则

.源文件扩展名.目标文件扩展名:

生成目标文件的规则

在使用隐含规则时要使用一些内定宏来指定文件名:

$@ 全路径的目标文件

$* 去除扩张名的全路径的目标文件

$? 所有源文件名

$< 源文件名
(e129)

netstat

1.作用
检查整个Linux网络状态。

2.格式
netstat [-acCeFghilMnNoprstuvVwx][-A][--ip]

3.主要参数

-a--all:显示所有连线中的Socket。
-A:列出该网络类型连线中的IP相关地址和网络类型。
-c--continuous:持续列出网络状态。
-C--cache:显示路由器配置的快取信息。
-e--extend:显示网络其它相关信息。
-F--fib:显示FIB。
-g--groups:显示多重广播功能群组组员名单。
-h--help:在线帮助。
-i--interfaces:显示网络界面信息表单。
-l--listening:显示监控中的服务器的Socket。
-M--masquerade:显示伪装的网络连线。
-n--numeric:直接使用IP地址,而不通过域名服务器。
-N--netlink--symbolic:显示网络硬件外围设备的符号连接名称。
-o--timers:显示计时器。
-p--programs:显示正在使用Socket的程序识别码和程序名称。
-r--route:显示Routing Table。
-s--statistice:显示网络工作信息统计表。
-t--tcp:显示TCP传输协议的连线状况。
-u--udp:显示UDP传输协议的连线状况。
-v--verbose:显示指令执行过程。
-V--version:显示版本信息。
-w--raw:显示RAW传输协议的连线状况。
-x--unix:和指定“-A unix”参数相同。
--ip--inet:和指定“-A inet”参数相同。

4.应用实例
netstat主要用于Linux察看自身的网络状况,如开启的端口、在为哪些用户服务,以及服务的状态等。此外,它还显示系统路由表、网络接口状态等。可以说,它是一个综合性的网络状态的察看工具。在默认情况下,netstat只显示已建立连接的端口。如果要显示处于监听状态的所有端口,使用-a参数即可:

#netstat -a
Active Internet connections (only servers)
Proto  Recv-Q   Send-Q    Local Address  Foreign Address  State
tcp	    0	   0   *:32768	*:*	LISTEN
tcp	    0      0   *:32769	*:*	LISTEN
tcp	    0	   0   *:nfs	*:*	LISTEN
tcp	    0	   0   *:32770	*:*	LISTEN
tcp	    0	   0   *:868	*:*	LISTEN
tcp	    0	   0   *:617	*:*	LISTEN
tcp	    0	   0   *:mysql	*:*	LISTEN
tcp	    0	   0   *:netbios-ssn	*:*	LISTEN
tcp	    0	   0   *:sunrpc	*:*	LISTEN
tcp	    0	   0   *:10000	*:*	LISTEN
tcp	    0	   0   *:http	*:*	LISTEN
......

上面显示出,这台主机同时提供HTTP、FTP、NFS、MySQL等服务。

telnet

1.作用
telnet表示开启终端机阶段作业,并登入远端主机。telnet是一个Linux命令,同时也是一个协议(远程登陆协议)。

2.格式
telnet [-8acdEfFKLrx][-b][-e][-k][-l][-n][-S][-X][主机名称IP地址<通信端口>]

3.主要参数

-8:允许使用8位字符资料,包括输入与输出。
-a:尝试自动登入远端系统。
-b:使用别名指定远端主机名称。
-c:不读取用户专属目录里的.telnetrc文件。
-d:启动排错模式。
-e:设置脱离字符。
-E:滤除脱离字符。
-f:此参数的效果和指定“-F”参数相同。
-F:使用Kerberos V5认证时,加上此参数可把本地主机的认证数据上传到远端主机。
-k:使用Kerberos认证时,加上此参数让远端主机采用指定的领域名,而非该主机的域名。
-K:不自动登入远端主机。
-l:指定要登入远端主机的用户名称。
-L:允许输出8位字符资料。
-n:指定文件记录相关信息。
-r:使用类似rlogin指令的用户界面。
-S:服务类型,设置telnet连线所需的IP TOS信息。
-x:假设主机有支持数据加密的功能,就使用它。
-X:关闭指定的认证形态。

4.应用说明
用户使用telnet命令可以进行远程登录,并在远程计算机之间进行通信。用户通过网络在远程计算机上登录,就像登录到本地机上执行命令一样。为了通过telnet登录到远程计算机上,必须知道远程机上的合法用户名和口令。虽然有些系统确实为远程用户提供登录功能,但出于对安全的考虑,要限制来宾的操作权限,因此,这种情况下能使用的功能是很少的。

telnet只为普通终端提供终端仿真,而不支持X-Window等图形环境。当允许远程用户登录时,系统通常把这些用户放在一个受限制的Shell中,以防系统被怀有恶意的或不小心的用户破坏。用户还可以使用telnet从远程站点登录到自己的计算机上,检查电子邮件、编辑文件和运行程序,就像在本地登录一样。

ftp

1.作用
ftp命令进行远程文件传输。FTP是ARPANet的标准文件传输协议,该网络就是现今Internet的前身,所以ftp既是协议又是一个命令。

2.格式
ftp [-dignv][主机名称IP地址]

3.主要参数

-d:详细显示指令执行过程,便于排错分析程序执行的情形。
-i:关闭互动模式,不询问任何问题。
-g:关闭本地主机文件名称支持特殊字符的扩充特性。
-n:不使用自动登陆。
-v:显示指令执行过程。

4.应用说明
ftp命令是标准的文件传输协议的用户接口,是在TCP/IP网络计算机之间传输文件简单有效的方法,它允许用户传输ASCⅡ文件和二进制文件。为了使用ftp来传输文件,用户必须知道远程计算机上的合法用户名和口令。这个用户名/口令的组合用来确认ftp会话,并用来确定用户对要传输的文件进行什么样的访问。另外,用户需要知道对其进行ftp会话的计算机名字的IP地址。

用户可以通过使用ftp客户程序,连接到另一台计算机上;可以在目录中上下移动、列出目录内容;可以把文件从远程计算机机拷贝到本地机上;还可以把文件从本地机传输到远程系统中。ftp内部命令有72个,下面列出主要几个内部命令:

ls:列出远程机的当前目录。
cd:在远程机上改变工作目录。
lcd:在本地机上改变工作目录。
close:终止当前的ftp会话。
hash:每次传输完数据缓冲区中的数据后就显示一个#号。
get(mget):从远程机传送指定文件到本地机。 
put(mput):从本地机传送指定文件到远程机。
quit:断开与远程机的连接,并退出ftp。

route

1.作用
route表示手工产生、修改和查看路由表。

2.格式
#route [-add][-net|-host] targetaddress [-netmask Nm][dev]If]
#route [-delete][-net|-host] targetaddress [gw Gw] [-netmask Nm] [dev]If]

3.主要参数

-add:增加路由。
-delete:删除路由。
-net:路由到达的是一个网络,而不是一台主机。
-host:路由到达的是一台主机。
-netmask Nm:指定路由的子网掩码。
gw:指定路由的网关。
[dev]If:强迫路由链指定接口。

4.应用实例

route命令是用来查看和设置Linux系统的路由信息,以实现与其它网络的通信。要实现两个不同的子网之间的通信,需要一台连接两个网络的路由器,或者同时位于两个网络的网关来实现。

在Linux系统中,设置路由通常是为了解决以下问题:该Linux系统在一个局域网中,局域网中有一个网关,能够让机器访问Internet,那么就需要将这台机器的IP地址设置为Linux机器的默认路由。使用下面命令可以增加一个默认路由:
route add 0.0.0.0 192.168.1.1

rlogin

1.作用
rlogin用来进行远程注册。

2.格式
rlogin [ -8EKLdx ] [ -e char ] [-k realm ] [ - l username ] host

3.主要参数
-8:此选项始终允许8位输入数据通道。该选项允许发送格式化的ANSI字符和其它的特殊代码。如果不用这个选项,除非远端的不是终止和启动字符,否则就去掉奇偶校验位。
-E:停止把任何字符当作转义字符。当和-8选项一起使用时,它提供一个完全的透明连接。
-K:关闭所有的Kerberos确认。只有与使用Kerberos 确认协议的主机连接时才使用这个选项。
-L:允许rlogin会话在litout模式中运行。要了解更多信息,请查阅tty联机帮助。
-d:打开与远程主机进行通信的TCP sockets的socket调试。要了解更多信息,请查阅setsockopt的联机帮助。
-e:为rlogin会话设置转义字符,默认的转义字符是“~”。
-k:请求rlogin获得在指定区域内远程主机的Kerberos许可,而不是获得由krb_realmofhost(3)确定的远程主机区域内的远程主机的Kerberos许可。
-x:为所有通过rlogin会话传送的数据打开DES加密。这会影响响应时间和CPU利用率,但是可以提高安全性。

4.使用说明
如果在网络中的不同系统上都有账号,或者可以访问别人在另一个系统上的账号,那么要访问别的系统中的账号,首先就要注册到系统中,接着通过网络远程注册到账号所在的系统中。rlogin可以远程注册到别的系统中,它的参数应是一个系统名。

vrcp

1.作用
rcp代表远程文件拷贝,用于计算机之间文件拷贝,使用权限是所有用户。

2.格式
rcp [-px] [-k realm] file1 file2 rcp [-px] [-r] [-k realm] file

3.主要参数
-r:递归地把源目录中的所有内容拷贝到目的目录中。要使用这个选项,目的必须是一个目录。
-p:试图保留源文件的修改时间和模式,忽略umask。
-k:请求rcp获得在指定区域内的远程主机的Kerberos许可,而不是获得由krb_relmofhost(3)确定的远程主机区域内的远程主机的Kerberos许可。
-x:为传送的所有数据打开DES加密。

finger

1.作用
finger用来查询一台主机上的登录账号的信息,通常会显示用户名、主目录、停滞时间、登录时间、登录Shell等信息,使用权限为所有用户。

2.格式
finger [选项] [使用者] [用户@主机]

3.主要参数
-s:显示用户注册名、实际姓名、终端名称、写状态、停滞时间、登录时间等信息。
-l:除了用-s选项显示的信息外,还显示用户主目录、登录Shell、邮件状态等信息,以及用户主目录下的.plan、.project和.forward文件的内容。
-p:除了不显示.plan文件和.project文件以外,与-l选项相同。

4.应用实例
在计算机上使用finger:

[root@localhost root]# Finger
Login  Name  Tty    Idle  Login Time  Office  Office Phone
root   root  tty1      2  Dec 15 11
root   root  pts/0     1  Dec 15 11
root   root  *pts/1       Dec 15 11

5.应用说明
如果要查询远程机上的用户信息,需要在用户名后面接“@主机名”,采用[用户名@主机名]的格式,不过要查询的网络主机需要运行finger守护进程的支持。

mail

1.作用
mail作用是发送电子邮件,使用权限是所有用户。此外,mail还是一个电子邮件程序。

2.格式

mail  [-s subject] [-c address] [-b address] 
	  mail -f [mailbox]mail [-u user]

3.主要参数

-b address:表示输出信息的匿名收信人地址清单。  
-c address:表示输出信息的抄送()收信人地址清单。  
-f [mailbox]:从收件箱者指定邮箱读取邮件。
-s subject:指定输出信息的主体行。
[-u user]:端口指定优化的收件箱读取邮件。

nslookup

1.作用
nslookup命令的功能是查询一台机器的IP地址和其对应的域名。使用权限所有用户。它通常需要一台域名服务器来提供域名服务。如果用户已经设置好域名服务器,就可以用这个命令查看不同主机的IP地址对应的域名。

2.格式
nslookup [IP地址/域名]

3.应用实例
(1)在本地计算机上使用nslookup命令

$ nslookup
Default Server: name.cao.com.cn
Address: 192.168.1.9
>

在符号“>”后面输入要查询的IP地址域名,并回车即可。如果要退出该命令,输入“exit”,并回车即可。

(2)使用nslookup命令测试named
输入下面命令:
nslookup

然后就进入交换式nslookup环境。如果named正常启动,则nslookup会显示当前DNS服务器的地址和域名,否则表示named没能正常启动。

下面简单介绍一些基本的DNS诊断。
◆检查正向DNS解析,在nslookup提示符下输入带域名的主机名,如hp712.my.com,nslookup应能显示该主机名对应的IP地址。如果只输入hp712,nslookup会根据/etc/resolv.conf的定义,自动添加my.com域名,并回答对应的IP地址。
◆检查反向DNS解析,在nslookup提示符下输入某个IP地址,如192.22.33.20,nslookup应能回答该IP地址所对应的主机名。
◆检查MX邮件地址记录在nslookup提示符下输入:
set q=mx

然后输入某个域名,输入my.com和mail.my.com,nslookup应能够回答对应的邮件服务器地址,即support.my.com和support2.my.com。

动手练习

1.危险的网络命令
互联网的发展使安全成为一个不能忽视的问题,finger、ftp、rcp和telnet在本质上都是不安全的,因为它们在网络上用明文传送口令和数据,嗅探器可以非常容易地截获这些口令和数据。而且,这些服务程序的安全验证方式也是有弱点的,很容易受到“中间服务器”方式的攻击。这里笔者把一些不安全的命令根据危险等级列出,见表3所示。

现在ftp、telnet可以被SSH命令代替绑定在端口22上,其连接采用协商方式,使用RSA加密。身份鉴别完成之后,后面的所有流量都使用IDEA进行加密。SSH(Secure Shell)程序可以通过网络登录到远程主机,并执行命令。rcp、rlogin等远程调用命令也逐渐被VNC软件代替。

2.在一张网卡上绑定多个IP地址
在Linux下,可以使用ifconfig方便地绑定多个IP地址到一张网卡。例如,eth0接口的原有IP地址为192.168.0 .254,可以执行下面命令:

ifconfig eth0:0 192.168.0.253 netmask 255.255.255.0 
ifconfig eth0:1 192.168.0.252 netmask 255.255.255.0 
......

3.修改网卡MAC地址
首先必须关闭网卡设备,命令如下:
/sbin/ifconfig eth0 down

修改MAC地址,命令如下:
/sbin/ifconfig eth0 hw ether 00:AA:BB:CC:DD:EE

重新启用网卡:
/sbin/ifconfig eht0 up

这样网卡的MAC地址就更改完成了。每张网卡的MAC地址是惟一,但不是不能修改的,只要保证在网络中的MAC地址的惟一性就可以了。

4.初步部署IPv6
IPv4技术在网络发展中起到了巨大的作用,不过随着时间的流逝它无论在网络地址的提供、服务质量、安全性等方面都越来越力不从心,IPv6呼之欲出。Linux是所有操作系统中最先支持IPv6的,一般Linux基于2.4内核的Linux发行版本都可以直接使用IPv6,不过主要发行版本没有加载IPv6模块,可以使用命令手工加载,需要超级用户的权限。

(1)加载IPv6模块
使用命令检测,其中inet6 addr: fe80::5054:abff:fe34:5b09/64,就是eth0网卡的IPv6地址。

# modprobe IPv6
#ifconfig 
eth0  Link encap:Ethernet  HWaddr 52:54:AB:34:5B:09
     inet addr:192.168.1.2  Bcast:192.168.1.255  Mask:255.255.255.0
    inet6 addr: fe80::5054:abff:fe34:5b09/64 Scope:Link
    UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
    RX packets:0 errors:0 dropped:0 overruns:0 frame:0
    TX packets:21 errors:0 dropped:0 overruns:0 carrier:0
    collisions:0 txqueuelen:100
    RX bytes:0 (0.0 b)  TX bytes:1360 (1.3 Kb)
    Interrupt:5 Base address:0xec00

(2)使用ping命令检测网卡的IPv6地址是否有效
#ping6 -I eth0 -c 2 fe80::200:e8ff:fea0:2586

和IPv4不一样,使用ping6命令时必须指定一个网卡界面,否则系统不知道将数据包发送到哪个网络设备。I表示Interface、eth0是第一个网卡,-c表示回路,2表示ping6操作两次。结果见图1所示。


图1 IPv6网络下的ping6命令

(3)使用ip命令在IPv6下为eth0增加一个IP地址
#ip -6 addr add 3ffe:ffff:0:f101::1/64 dev eth0

使用ifconfig命令,查看网卡是否出现第二个IPv6地址。

Linux网络的主要优点是能够实现资源和信息的共享,并且用户可以远程访问信息。Linux提供了一组强有力的网络命令来为用户服务,这些工具能够帮助用户进行网络设定、检查网络状况、登录到远程计算机上、传输文件和执行远程命令等。

上面介绍了Linux中比较重要的网络命令,其实Linux还有许多命令需要学习。Linux网络操作命令的一个特点就是命令参数选项很多,并不要求全部记住,关键在于理解命令的主要用途和学会使用帮助信息。(T111)

 

你可能感兴趣的:(linux,shell,网络,vim,bash,makefile)