TLCL学习笔记02——使用命令、重定向、从shell眼中看世界

来源:互联网 发布:java全栈开发工程师 编辑:程序博客网 时间:2024/04/26 03:51

1.使用命令

type – Indicate how a command name is interpreted   说明怎样解释一个命令名

which– Display which executable program will be executed 显示会执行哪个可执行程序

man– Display a command’s manual page   显示命令手册页

apropos– Display a list of appropriate commands   显示一系列适合的命令

info– Display a command’s info entry   显示命令 info

whatis– Display a very brief description of a command   显示一个命令的简洁描述

alias– Create an alias for a command   创建命令别名

什么是命令

命令可以是下面四种形式之一:

1. 是一个可执行程序,属于这一类的程序,可以编译成二进制文件,诸如用C 和C++ 语言写成的程序, 也可以是由脚本语言写成的程序,比如说shell,perl,python,ruby,等等。

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

3. 是一个shell 函数。这些是小规模的shell 脚本,它们混合到环境变量中。

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


type -显示命令的类型

使用格式:type command       “command” 是你要检测的命令名


which -显示一个可执行程序的位置

因为可执行命令有可能会有多个版本,所以有必要根据位置来判断究竟是哪个。

which仅对可执行程序有效,对shell内置命令和alias无效。

当我们试着使用shell 内部命令时,例如,cd 命令,我们或者得不到回应,或者是个错误信息。


help -得到shell 内部命令的帮助文档bash

使用格式:help command      

例如:[me@linuxbox ~]$ help cd
           cd: cd [-L|-P] [dir]

注意表示法:出现在命令语法说明中的方括号,表示可选的项目。一个竖杠字符表示互斥选项。


--help

命令选项(option):--help展示使用信息。
很多可执行程序都支持一个--help的option来展示命令的信息。
有一些程序并不支持—help选项,但是可以试试。

man -显示程序手册页

使用格式man program  “program”是要浏览的命令名。

在大多数Linux 系统中,man 使用less 工具来显示参考手册。

man 所显示的参考手册,被分成几个章节,它们不仅仅包括用户命令,也包括系统管理员命令,程序接口,文件格式等等。下表描绘了手册的布局:


指定章节号man section search_term

apropos -显示适当的命令

  apropos命令,根据关键字查询可能合适的命令。

  man命令加-k和apropos是一样的效果,可以man man看一下。

whatis -显示非常简洁的命令说明

  whatis—Display a very brief description of a command.

  whatis命令,展示一个命令的非常简短的描述。

info -显示程序Info 条目

GNU项目提供了man pages的替代品:info pages。

info pages由一个叫做info的阅读程序展示。

info 程序读取info 文件,info 文件是树型结构,分化为各个结点,每一个包含一个题目。info 文件包含超级链接,它可以让你从一个结

点跳到另一个结点。一个超级链接可通过它开头的星号来辨别出来,把光标放在它上面并按下enter 键,就可以激活它。


 

用别名(alias)创建你自己的命令

  多个命令可以由分号间隔放在同一行执行:

  command1; command2; command3…

 

  可以使用alias为多个命令的序列起一个别名。

  使用alias的第一件事,就是起一个新的名字,首先要检查一下这个名字是否被使用过(可以用type命令检查)。

  想到了一个没有被使用过的名字之后,就可以利用alias命令了:

  命令格式如下:

  alias newname=’string’

  在alias关键字之后,是一个自定义的名字,之后是一个等号,然后是一个单引号包含的字符串,是要赋予这个自定义名字的意义。

  定义好之后,这个新的名字就可以像命令一样在shell中使用了。

 

  可以用type命令来检查它,也可以用unalias来取消它。

  当alias后面不跟任何参数独自出现的时候,可以查看当前所有存在的别名。

  注意,当shell session结束时别名会消失。

2.重定向

cat- Concatenate files   连接文件
sort- Sort lines of text   排序文本行
uniq- Report or omit repeated lines   报道或省略重复行
grep - Print lines matching a pattern    打印匹配行
wc - Print newline, word, and byte counts for each file   打印文件中换行符,字,和字节个数
head - Output the first part of a file    输出文件第一部分
tail - Output the last part of a file    输出文件最后一部分
tee - Read from standard input and write to standard output and files   从标准输入读取数据,并同时写到标准输出和文件

标准输入,输出,和错误

I/O 重定向允许我们可以更改输出走向和输入来向。

重定向标准输出

(1)重定向标准输出到另一个文件除了屏幕,我们使用 “>” 重定向符,其后跟着文件名。

列如:ls -l /usr/bin > ls-output.txt

当我们使用 “>” 重定向符来重定向输出结果时,目标文件总是从开头被重写。 

列如:ls -l /bin/usr > ls-output.txt,将不存在的文件/bin/usr指向ls-output.txt,会清空ls-output.txt。

[me@linuxbox ~]$ > ls-output.txt

简单地使用重定向符,没有命令在它之前,这会删除一个已存在文件的内容或是 创建一个新的空文件。

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

[me@linuxbox ~]$ ls -l /usr/bin >> ls-output.txt

重定向标准错误

重定向标准错误缺乏专用的重定向操作符。

一个程序可以在几个编号的文件流中的任一个上产生输出。然而我们必须把这些文件流的前 三个看作标准输入,输出和错误,shell 

内部参考它们为文件描述符0,1和2。

[me@linuxbox ~]$ ls -l /bin/usr 2> ls-error.txt

文件描述符”2”,紧挨着放在重定向操作符之前,来执行重定向标准错误到文件 ls-error.txt 任务。

重定向标准输出和错误到同一个文件

第一个,传统的方法

>ls-output.txt 2>&1

首先重定向标准输出到文件 ls-output.txt,然后 重定向文件描述符2(标准错误)到文件描述符1(标准输出)使用表示法2>&1。注意重定向的顺序安排非常重要。标准错误的重定向必须总是出现在标准输出 重定向之后,要不然它不起作用。

现在的 bash 版本提供了第二种方法

[me@linuxbox ~]$ ls -l /bin/usr &> ls-output.txt

使用单单一个表示法 &> 来重定向标准输出和错误

处理不需要的输出

系统为我们提供了解决问题的方法,通过重定向输出结果 到一个特殊的叫做”/dev/null”的文件。这个文件是系统设备,叫做位存储桶,它可以 接受输入,并且对输入不做任何处理。

cat - 连接文件

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

使用格式:cat [file]


如果 cat 没有给出任何参数,它会从标准输入读入数据,因为标准输入,默认情况下,连接到键盘。 它正在等待我们输入数据!下一步,输入 Ctrl-d(按住 Ctrl 键同时按下”d”),来告诉 cat,在标准输入中, 它已经到达文件末尾(EOF)


 cat < lazy_dog.txt

使用“<”重定向操作符,我们把标准输入源从键盘改到文件 lazy_dog.tx。注意与重定向标准输出的区别。

管道线

令可以从标准输入读取数据,然后再把数据输送到标准输出,命令的这种能力被 一个 shell 特性所利用,这个特性叫做管道线。

使用管道操作符”|”(竖杠),一个命令的 标准输出可以管道到另一个命令的标准输入:

使用格式:command1 | command2

列如:ls -l /usr/bin | less

过滤器

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

列如:ls /bin /usr/bin | sort | less

uniq - 报道或忽略重复行

uniq 命令经常和 sort 命令结合在一起使用。uniq 从标准输入或单个文件名参数接受数据有序 列表(详情查看 uniq 手册页),默认情况下,从数据列表中删除任何重复行。

列如:ls /bin /usr/bin | sort | uniq | less

如果我们想看到 重复的数据列表,让 uniq 命令带上”-d”选项。例如:ls /bin /usr/bin | sort | uniq -d | less

wc - 打印行,字和字节数

wc(字计数)命令是用来显示文件所包含的行,字和字节数。

如果 wc 不带命令行参数,它接受标准输入。”-l”选项限制命令输出只能 报道行数。

添加 wc 到管道线来统计数据,是个很便利的方法。查看我们的有序列表中程序个数, 我们可以这样做:

ls /bin /usr/bin | sort | uniq | wc -l

grep - 打印匹配行

grep 是个很强大的程序,用来找到文件中的匹配文本。

使用格式:grep pattern [file...]

当 grep 遇到一个文件中的匹配”模式”,它会打印出包含这个类型的行。

grep 有-对方便的选项:”-i”导致 grep 忽略大小写当执行搜索时(通常,搜索是大小写 敏感的),”-v”选项会告诉 grep 只打

印不匹配的行。

例如:ls /bin /usr/bin | sort | uniq | grep zip    在我们的程序列表中,找到文件名中包含单词”zip”的所有文件。

head / tail - 打印文件开头部分/结尾部分

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

例如:head -n 5 ls-output.txt

它们也能用在管道线中:ls /usr/bin | tail -n 5

tail 有一个选项允许你实时的浏览文件。当观察日志文件的进展时,这很有用,因为 它们同时在被写入。使用”-f”选项,tail 命

令继续监测这个文件,当新的内容添加到文件后,它们会立即 出现在屏幕上。这会一直继续下去直到你输入 Ctrl-c。

例如:tail -f /var/log/messages

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

tee 程序从标准输入读入数据,并且同时复制数据 到标准输出(允许数据继续随着管道线流动)和一个或多个文件。

例如:ls /usr/bin | tee ls.txt | grep zip

3.从 shell 眼中看世界

echo - Display a line of text    显示一行文本

(字符)展开

通过展开, 你输入的字符,在 shell 对它起作用之前,会展开成为别的字符。

例如:echo this is a test

 

[me@linuxbox ~]$ echo *Desktop Documents ls-output.txt Music Pictures Public Templates Videos

路径名展开

例如:echo D*

echo /usr/*/share

echo *       不会显示隐藏文件

echo .*        展开模式中包含隐藏文件, 而且隐藏文件可能会出现在第一位置。我们会看到名字”.” 和”..”也出现在结果中。

ls -d .[!.]?*    这种模式展开成为文件名,每个文件名以圆点开头,第二个字符不包含圆点,再包含至少一个字符, 并且这个字

符之后紧接着任意多个字符。这将列出大多数的隐藏文件 (但仍将不能包含以多个圆点开头的文件名)这个带有 -A 选项(“几

乎所有”)的 ls 命令能够提供一份正确的隐藏文件清单:ls -A

波浪线展开

echo ~       当它用在 一个单词的开头时,它会展开成指定用户的家目录名,如果没有指定用户名,则是当前用户的家目录:

echo ~lcz

算术表达式展开

算术表达式展开使用这种格式:$((expression))    (以上括号中的)表达式是指算术表达式,它由数值和算术操作符组成。

算术表达式只支持整数(全部是数字,不带小数点)


在算术表达式中空格并不重要,并且表达式可以嵌套。

例如,5的平方乘以3:echo $(($((5**2)) * 3))     

花括号展开

花括号展开模式可能包含一个开头部分叫做报头,一个结尾部分叫做附言。花括号表达式本身可 能包含一个由逗号分开的字符串列表,或者一系列整数,或者单个的字符串。这种模式不能 嵌入空白字符。

花括号展开可以嵌套:

[me@linuxbox ~]$ echo a{A{1,2},B{3,4}}baA1b aA2b aB3b aB4b

参数展开

这时 echo 命令只简单地显示误键入的模式。通过参数展开,如果你拼写错了一个变量名, 展开仍然会进行,只是展成一个空

字符串:

[me@linuxbox ~]$ echo $USERme
[me@linuxbox ~]$ echo $SUER[me@linuxbox ~]$

命令替换

命令替换允许我们把一个命令的输出作为一个展开模式来使用:

也可以使用整个管道线 (只展示部分输出):在这个例子中,管道线的输出结果成为 file 命令的参数列表。


在旧版 shell 程序中,有另一种语法也支持命令替换,可与刚提到的语法轮换使用。 bash 也支持这种语法。它使用倒引号来

代替美元符号和括号:

引用


shell 从 echo 命令的参数列表中,删除多余的空格。shell 提供了一种 叫做引用的机制,来有选择地禁止不需要的展开。

双引用

如果你把文本放在双引号中, shell 使用的特殊字符,除了 $,\ (反斜杠),和 `(倒引号)之外, 则失去它们的特殊含义,被

当作普通字符来看待。

这意味着单词分割,路径名展开, 波浪线展开,和花括号展开都被禁止,然而参数展开,算术展开,和命令替换 仍然执行

使用双引号,我们可以处理包含空格的文件名。

例如:


单词分割:在默认情况下,单词分割机制会在单词中寻找空格,制表符,和换行符,并把它们看作 单词之间的界定符。它们

作为分隔符使用。


单词分割被禁止,内嵌的空格也不会被当作界定符,它们成为参数的一部分。

单引用

如果需要禁止所有的展开,我们使用单引号。



转义字符










0 0
原创粉丝点击