美文网首页
快乐的命令行(二)

快乐的命令行(二)

作者: 夏日不归 | 来源:发表于2018-04-16 16:41 被阅读0次

    1、使用命令

       1.1、命令是什么:

    A、是一个可执行程序,就像我们所看到的位于目录/usr/bin 中的文件一样。 这一类程序可以是用诸如 C 和 C++语言写成的程序编译的二进制文件, 也可以是由诸如shell,perl,python,ruby等等脚本语言写成的程序 。

    B、是一个内建于 shell 自身的命令。bash 支持若干命令,内部叫做 shell 内部命令 (builtins)。例如,cd 命令,就是一个 shell 内部命令。

    C、是一个 shell 函数。这些是小规模的 shell 脚本,它们混合到环境变量中。 在后续的章节里,我们将讨论配置环境变量以及书写 shell 函数。但是现在, 仅仅意识到它们的存在就可以了。

    D、是一个命令别名。我们可以定义自己的命令,建立在其它命令之上。

       1.2、 识别命令

     type 命令:是 shell 内部命令,它会显示命令的类别,给出一个特定的命令名(做为参数)。

    type command          like: type ls 、type type 、type cp

    注意:ls 命令(在 Fedora 系统中)的检查结果,ls 命令实际上 是 ls 命令加上选项”--color=tty”的别名。

    which命令:确定所给定的执行程序的准确位置。只对可执行程序有效,不包括内建命令和命令别名,别名是真正的可执行程序的替代物。 当我们试着使用 shell 内建命令时,例如,cd 命令,我们或者得不到回应,或者是个错误信息。

    which command       like: which ls 

    help命令

    注意表示法:出现在命令语法说明中的方括号,表示可选的项目。一个竖杠字符 表示互斥选项。这种表示法说明,cd 命令可能有一个“-L”选项或者“-P”选项,进一步,可能有参数“dir”

    help命令用法

    许多可执行程序支持一个 --help 选项,这个选项是显示命令所支持的语法和选项说明。一些程序不支持 --help 选项,但不管怎样试一下。这经常会导致输出错误信息,但同时能 揭示一样的命令用法信息。

    mkdir  --help

    man

    许多希望被命令行使用的可执行程序,提供了一个正式的文档,叫做手册或手册页(man page)。一个特殊的叫做 man 的分页程序,可用来浏览他们。它是这样使用的:

    man program

    在大多数 Linux 系统中,man 使用 less 工具来显示参考手册,所以当浏览文档时,你所熟悉的 less 命令都能有效。

    手册文档的格式有点不同,一般地包含一个标题、命令语法的纲要、命令用途的说明、 以及每个命令选项的列表和说明。然而,手册文档通常并不包含实例,它打算 作为一本参考手册,而不是教程。

    手册页的组成形式

    有时候,我们需要查看参考手册的特定章节,从而找到我们需要的信息。 如果我们要查找一种文件格式,而同时它也是一个命令名时,这种情况尤其正确。 没有指定章节号,我们总是得到第一个匹配项,可能在第一章节。我们这样使用 man 命令, 来指定章节号:

    man section search_term                      like: man 5 passwd

    apropos适当的命令

    基于某个关键字的匹配项。输出结果每行的第一个字段是手册页的名字,第二个字段展示章节。注意,man 命令加上”-k”选项, 和 apropos 完成一样的功能。

    适当的命令

    whatis : 程序显示匹配特定关键字的手册页的名字和一行命令说明

    info:GNU 项目提供了一个命令程序手册页的替代物,称为”info”。info 内容可通过 info 阅读器 程序读取。info 页是超级链接形式的,和网页很相似。

    info命令

    1.3、编写命令

    可以把多个命令放在同一行上,命令之间 用”;”分开。它像这样工作:

    command1;  command2 ;  command3

    用 alias 命令创建我们自己的命令。我们要做的第一件事就是为我们的新命令构想一个名字。 比方说”test”。在使用”test”之前,查明是否”test”命令名已经存在系统中,是个很不错 的主意。为了查清此事,可以使用 type 命令:

    type test    test  is a shell builtin

    创建命令格式:

    alias name=‘string’

    在命令”alias”之后,输入“name”,紧接着(没有空格)是一个等号,等号之后是 一串用引号引起的字符串,字符串的内容要赋值给 name。

    删除命令格式:

    unalias name

    在命令行中定义别名有点儿小问题。当你的 shell 会话结束时,它们会消失。

    2、重定向

    I/O 重定向。”I/O”代表输入/输出, 通过这个工具,你可以重定向命令的输入输出,命令的输入来自文件,而输出也存到文件。 也可以把多个命令连接起来组成一个强大的命令管道。

    2.1 常用命令

    cat - 连接文件

    sort - 排序文本行

    uniq - 报道或省略重复行

    grep - 打印匹配行

    wc - 打印文件中换行符,字,和字节个数

    head - 输出文件第一部分

    tail - 输出文件最后一部分

    tee - 从标准输入读取数据,并同时写到标准输出和文件

    2.2 标准输入输出

    我们用到的许多程序都会产生某种输出。这种输出,经常由两种类型组成。 第一,程序运行结果;这是说,程序要完成的功能。第二,我们得到状态和错误信息, 这些告诉我们程序进展。如果我们观察一个命令,像 ls,会看到它的运行结果和错误信息 显示在屏幕上。

    与 Unix 主题“任何东西都是一个文件”保持一致,程序,比方说 ls,实际上把他们的运行结果 输送到一个叫做标准输出的特殊文件(经常用 stdout 表示),而它们的状态信息则送到另一个 叫做标准错误的文件(stderr)。默认情况下,标准输出和标准错误都连接到屏幕,而不是 保存到磁盘文件。除此之外,许多程序从一个叫做标准输入(stdin)的设备得到输入,默认情况下, 标准输入连接到键盘。I/O 重定向允许我们更改输出地点和输入来源。一般地,输出送到屏幕,输入来自键盘, 但是通过 I/O 重定向,我们可以做出改变。

    2.3 标准输出重定向

    使用 “>” 重定向符后接文件名将标准输出重定向到除屏幕以外的另一个文件。指定了一个不存在的目录/bin/usr, 错误信息显示在屏幕上而不是被重定向到文件。因为 ls 程序不把它的错误信息输送到标准输出。反而,像许多写得不错的 Unix 程序,ls 把错误信息送到标准错误。因为我们只是重定向了标准输出,而没有重定向标准错误, 所以错误信息被送到屏幕。

    注意:使用 “>” 重定向符来重定向输出结果时,目标文件总是从开头被重写。简单地使用重定向符,没有命令在它之前,这会清空一个已存在文件的内容或是 创建一个新的空文件。

    因此,使用”>>“操作符,将导致输出结果添加到文件内容之后。如果文件不存在,文件会 被创建,就如使用了”>”操作符。

    标准输出重定向

    2.4 标准错误重定向

    标准错误重定向没有专用的重定向操作符。为了重定向标准错误,我们必须参考其文件描述符。 一个程序可以在几个编号的文件流中的任一个上产生输出。虽然我们已经将这些文件流的前三个称作标准输入、输出和错误,shell 内部分别将其称为文件描述符0、1和2。shell 使用文件描述符提供 了一种表示法来重定向文件。文件描述符”2”,紧挨着放在重定向操作符之前,来执行重定向标准错误到文件 ls-error.txt 任务。

    2 > ls-error.txt

    2.5 标准输出与标准错误同一个文件

    我们希望捕捉一个命令的所有输出到一个文件。为了完成这个,我们 必须同时重定向标准输出和标准错误。有两种方法来完成任务。第一个,传统的方法, 在旧版本 shell 中也有效:

    ls-output.txt  2>&1

    使用这种方法,我们完成两个重定向。首先重定向标准输出到文件 ls-output.txt,然后重定向文件描述符2(标准错误)到文件描述符1(标准输出)使用表示法2>&1。

    注意重定向的顺序安排非常重要。标准错误的重定向必须总是出现在标准输出重定向之后,要不然它不起作用。下面的命令标准错误定向到屏幕

    2>&1 ls-output.txt

    现在的 bash 版本提供了第二种方法,更精简合理的方法来执行这种联合的重定向。我们使用单单一个表示法 &> 来重定向标准输出和错误到文件 ls-output.txt。

    >& ls-output.txt

    2.6 处理不需要的输出

    有时候“沉默是金”,我们不想要一个命令的输出结果,只想把它们扔掉。这种情况 尤其适用于错误和状态信息。系统通过重定向输出结果到一个叫做”/dev/null”的特殊文件,为我们提供了解决问题的方法。这个文件是系统设备,叫做位存储桶,它可以接受输入,并且对输入不做任何处理。为了隐瞒命令错误信息,我们这样做:

    2 > /dev/null

    2.7 标准输入重定向

    cat :读取一个或多个文件,然后复制它们到标准输出

    cat ls-output.txt

    如果cat后没有其他参数,它会从标准输入读入数据,又因为标准输入默认情况下连接到键盘, 它正在等待我们输入数据!下一步,输入 Ctrl-d(按住 Ctrl 键同时按下”d”),来告诉 cat,在标准输入中, 它已经到达文件末尾(EOF)。由于没有文件名参数,cat 复制标准输入到标准输出,所以我们看到文本行重复出现。 我们可以使用这种行为来创建简短的文本文件。

    cat创建简单文本

    小列子:cat输入到文件在从文件读取信息。注意:输入结束Ctrl+d。

    小列子

    使用“<”重定向操作符,我们把标准输入源从键盘改到文件 lazy_dog.tx。我们看到结果 和传递单个文件名作为参数的执行结果一样。把这和传递一个文件名参数作比较,不是特别有意义, 但它是用来说明把一个文件作为标准输入源。有其他的命令更好地利用了标准输入,我们不久将会看到。

    cat修改标准输入源

    2.7.1 管道线

    命令从标准输入读取数据并输送到标准输出的能力被一个称为管道线的 shell 特性所利用。 使用管道操作符”|”(竖杠),一个命令的标准输出可以通过管道送至另一个命令的标准输入:

    command1 | command2

     less 命令接受标准输入。我们用 less 来一页一页地显示任何命令的输出,命令把它的运行结果输送到标准输出。

    ls -l /usr/bin | less

    2.7.2 过滤器

    管道线经常用来对数据完成复杂的操作。有可能会把几个命令放在一起组成一个管道线。 通常,以这种方式使用的命令被称为过滤器。过滤器接受输入,以某种方式改变它,然后 输出它。

    第一个我们想试验的过滤器是 sort。想象一下,我们想把目录/bin 和/usr/bin 中 的可执行程序都联合在一起,再把它们排序,然后浏览执行结果。因为我们指定了两个目录(/bin 和/usr/bin),ls 命令的输出结果由有序列表组成, 各自针对一个目录。通过在管道线中包含 sort,我们改变输出数据,从而产生一个有序列表。

    ls /bin /usr/bin | sort  | less

    2.7.3 报道或忽略重复行

    uniq 命令经常和 sort 命令结合在一起使用。uniq 从标准输入或单个文件名参数接受数据有序 列表(详情查看 uniq 手册页),默认情况下,从数据列表中删除任何重复行。如果我们想看到 重复的数据列表,让 uniq 命令带上”-d”选项,就像这样:

    ls /bin /usr/bin | sort | uniq | less

    ls /bin /usr/bin | sort | uniq-d | less

    2.7.4 WC

    wc(字计数)命令是用来显示文件所包含的行数、字数和字节数。wc 打印出来三个数字:包含在文件中的行数,单词数和字节数, 正如我们先前的命令,如果 wc 不带命令行参数,它接受标准输入。”-l”选项限制命令输出只能 报道行数。添加 wc 到管道线来统计数据,是个很便利的方法。查看我们的有序列表中程序个数, 我们可以这样做

    wc 字计数

    2.7.5 grep

    grep 是个很强大的程序,用来找到文件中的匹配文本。这样使用 grep 命令:

    grep pattern [file...]

    当 grep 遇到一个文件中的匹配”模式”,它会打印出包含这个类型的行。grep 能够匹配的模式可以 很复杂,但是现在我们把注意力集中在简单文本匹配上面。

    比如说,我们想在我们的程序列表中,找到文件名中包含单词”zip”的所有文件。这样一个搜索, 可能让我们了解系统中的一些程序与文件压缩有关系。这样做:

    grep 匹配

    grep 有一些方便的选项:”-i”使得 grep 在执行搜索时忽略大小写(通常,搜索是大小写 敏感的),”-v”选项会告诉 grep 只打印不匹配的行。

    2.7.6 head/tail

    head 命令打印文件的前十行,而 tail 命令打印文件的后十行。默认情况下,两个命令 都打印十行文本,但是可以通过”-n”选项来调整命令打印的行数。

    head tail的使用

    tail 有一个选项允许你实时地浏览文件。当观察日志文件的进展时,这很有用,因为 它们同时在被写入。使用”-f”选项,tail 命令继续监测这个文件,当新的内容添加到文件后,它们会立即 出现在屏幕上。这会一直继续下去直到你输入 Ctrl-c。

    2.7.7 tee - 从 Stdin 读取数据,并同时输出到 Stdout 和文件

    为了和我们的管道隐喻保持一致,Linux 提供了一个叫做 tee 的命令,这个命令制造了 一个”tee”,安装到我们的管道上。tee 程序从标准输入读入数据,并且同时复制数据到标准输出(允许数据继续随着管道线流动)和一个或多个文件。当在某个中间处理阶段来捕捉一个管道线的内容时,这很有帮助。

    我们重复执行一个先前的例子, 这次包含 tee 命令,在 grep 过滤管道线的内容之前,来捕捉整个目录列表到文件 ls.txt:

    捕获

    相关文章

      网友评论

          本文标题:快乐的命令行(二)

          本文链接:https://www.haomeiwen.com/subject/dxwivxtx.html