转自:http://blog.csdn.net/flowingflying/archive/2009/09/21/4577635.aspx

 

一些I/O操作

  Linux的I/O有两个特点,一、I/O分为character和block两类;二、所有的产生和接收数据都可以视为file。而就是说这 些I/O操作都可以视为文件操作。几个常用的命令包括

cat(copy输入到输出)
grep(在输入中查询某些字符串);
sort(排序);
cut(抽取列);
sed(在输入中提供edit);
tr(将输入中的某些字符更换为另外的字符)

  所有的UNIX程序都有标准输入stdin, stdout和stderr,这些输入和输出可以重新向为其他文件,我们可以通过"<"和">"重定向他们。这个输入和输出的方向已经表示得 很清楚了。例如echo "Hello, world!" >temp ,输出置temp文件中。如果我们将某个命令的输出作为另一个命令的输入,这种结构成为管道(pipe),使用“|”,如果一个命令通过pipe含有两个 或者多个命令,这种命令成为pipeline。例如ls -l | less。下面是一个复杂点的例子:

   将/etc/passwd中抽取用户名,并按排序显示出来。我们使用cut命令,cut -d: -f1,表示列是按“:”来分隔,我们需要第一列。在/etc/passwd中第一列就是用户名。命令为:cut -d: -f1 /etc/passwd | sort,如果我们希望将结果打印出来,命令 为:cut -d: -f1 /etc/passwd | sort | lp。

前台和后台命令

  如 果我们需要命令后台运行,即在运行结束之前,可以在当前的terminal执行其他操作,使用&。一般的命令是前提命令,即命令结束之前不能执行 其他命令。后台运行对于我们服务的部署是经常用到的。我们通常在系统启动后运行的rc.local文件中加入我们的服务命令:myservice &,这样在系统启动后myservice就作为后台作业一直运行。如果一旦作为后台命令,就不能通过stdin获得输入,如果命令需要等待用户敲 键盘输入,那就一直在那里等。如果我们在terminal中启动了后台命令,但又输入的时候,会输出到termial,如果当前我们前台命令也有输出,就 会混在一起,这是见输出结果重定向到一个文件是一个很好选择。

  一 般来讲前台和后台命令具有同样的优先级别,但是有时当计算机资源紧张的时候,我们可能希望后台命令不要影响前台命令,或者我们的后台服务具有很高的优先级 别,不希望受到印象,可以通过nice命令来设置他们的优先级别。可以通过man nice来查阅。在cgywin中缺省优先级别为10,数值越大优先级别越低,nice -n8 command1,将command1的优先基本设置为8。

一些特殊符号

  在shell中有一些特殊的符号,例如 < , > , |, $ , &,* 等等。有时候我们并不需要这些特殊符号作为特殊的用途,而仅仅是一个character,这种场合,使用引号,引号有单引号和双引号,单引号表示 strong quote,而双引号表示weak quote,对于双引号他只能识别出某些特殊符号,这对某些情况是合适的,将在这本书后面的章节中介绍。

  echo 2 * 3 > 5 is a valid inequality,> 5表示将输出重定向到名字为5的文件中,即等同于echo 2 * 3 is a valid inequlity > 5,而*是通配符,echo命令并不需要作出选择或者匹配,我们实验了一下,在5的文件中放入了 2 temp 3 is a valid inquality。但是实际上我们是希望在termimal上能输出 2 * 3 > 5 is a valid inequality,我们需要屏蔽>和*这两个特殊符号的特殊用途,加引号,例如echo '2 * 3 > 5 is a valid inequality',我们也可以只将包含特殊符号的部位quote来,例如 echo '2 * 3 > 5' is a valid inequality,他们的效果是一样的。

  如果我们需要屏蔽某一个特殊字符的特殊用法,可以使用反斜杠\,例如'*'等同于\*,在上面的例子中我们可以写为: echo 2 \* 3 \> 5 is a valid inequality,有例如我们希望显示 '2 * 3 > 5' is a valid inequality,可以写为echo \'2 \* 3 \> 5\' is a valid inequality。如果先显示\本身,可以用\\。shell是根据顺序来进行解析的,我们注意引号嵌套的方式。

  例如echo 'hello\" world',输出为hello\" world,第一个单引号开始,查找另一个单引号,中间所有的特殊字符将忽略,包括\符号。例如echo 'hello\' world',第二个引号是中间,因此有了第一串字符hello\,然后又发现了一个',系统将等等下一个',认为命令没有完,显示<,提示继续输 入。

  对于双引号这个weak quote,情况有些变化,echo "hello\\ world",显示hello\ world,而echo 'hello\\ world'显示hello\\ world,又例如echo "hello\" world",显示hello" world,echo "hello\' world"显示hello\' world,对于双引号中\是否有效,其中\"、\\、有效,仍将\是为特殊符合,而\'无效,不视为特殊符合。对于这种混乱的情况,没有必要去记住(估 计也容易忘掉),我们只要避免编写这类的方式就可以了,如果不是需要,不要使用双引号,或者双引号之间,避免使用特殊符号,如果有,测试一下就可以了。

  我们可以用\后面按Enter键,表示\后面的Enter是个普通的换行,而不是输入结束。shell使用这种方式来实现多行输入,换行的时候 只要键入\就可以了。

一些控件键

  CTRC+某个按键具有特殊的控制用途,我一般就只用CTRC-C,也写为^C。记录如下。我们也可以用stty -a来查看这些控制。

    CTRL-C:停止当前命令
    CTRL-D:停止input,通常logout
    CTRL-\:在CRTL-C无效的使用,用于停止当前命令,其实使用kill也可以,没必要记太多
    CTRL-S:停止屏幕输出
    CTRL-Q:重新输出屏幕
    CTRL-U:删除正航命令,一般CTRL-C效果一样
    CTRL-Z:挂起当前命令,在这本书的第8章详细描述

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注