命令是否执行的依据
在许多的编程语言中,逻辑表达式往往是不可或缺的一部分。在Linux中也存在着相关的命令可以达到逻辑表达式的效果。下面我们就来一起学习这部分的知识。
一次回车执行多条命令的操作
在两个命令中使用“;”可以使这两个命令连续执行。例如下面这样:
这里使用mkdir test
先创建test目录,然后将工作目录切换到前一命令创建的目录中。但是这段命令可能会报错,因为如果test目录已经存在的话,则会报错。也就是说,现在这两个命令存在关联性。那么此时我们就可以使用Linux中的逻辑符号来解决这个问题。逻辑符号:&&,ll
在Linux中,每一个命令的执行之后,都会有一个回传码。如果命令执行成功,则会回传一个数字0作为成功执行的标识,如果失败,则是1。值最后会被存储在$?这个变量中。现在我们已经知道命是否令已经执行成功了,下面是该两个逻辑符号的说明:
&&
- cmd1 && cmd2 :若cmd1执行后,回传码为0,则开始执行cmd2; 若cmd1执行后,回创码为1,则comd2不执行。
||
- cmd1 || cmd2: 若cmd1执行后,回传码为0,则cmd2不执行;若cmd1执行后,回传码为1,则开始执行cmd2。
栗子
栗子1 : 判断是否有
~/LogicCommandFolder
目录。如果有则将工作目录切换到该目录下面,并在该目录下创建文件名为LogicCommandFIle的文件。没有则什么都不做。
这里只以~/LogicCommandFolder
目录存在为例子,所有先创建该文件。由于有该目录,所有表达式1的回传码为0,并且已经将工作目录切换到该目录,然后再在该目录下创建LogicCommandFIle文件。栗子2 : 根据
~/
目录下是否有LogicCommand文件,如果有则不进行任何操作,没有就创建该文件(但是控制会有错误信息)。
这是没有LogicCommand文件的情况下执行之后的效果,可以看到cat ~/LogicCommand
执行的时候,由于没有LogicCommand文件所有控制台报出了一段错误信息,并且回传码是1。所以
开始执行touch ~/LogicCommand
。栗子 : 不管有没有
~/tmp/chestnut/
目录存不存在,都在该目录下创建文件名为anyway的文件。
这个条命令会有两条执行路线:如果
/tmp/chestnut/
目录不存在,则回传码是1,所以开始执行mkdir /tmp/chestnut
命令创建该目录,因为这段命令会成功执行,所以回传码为0,后面执行touch /tmp/chestnut/anyway
命令来创建anyway文件。如果
/tmp/chestnut/
目录存在,则回传码是0,而||
遇到回传码为0所以不执行mkdir /tmp/chestnut
,接下来,回传码0会继续往右传递,因为右边是&&
,所以执行touch /tmp/chestnut/anyway
命令来创建anyway文件。
数据流重定向是什么
一般来说,我们使用命令行来操作Linux,那这跟数据流重定向又有什么关系呢?举个栗子,假设你需要将一个命令所输出的信息存储到一个文件里面该怎么办?,那么数据流重定向就能解决这个问题。一般来说你执行一个命令通常它会是下面这张图所示的,
当我们执行一个命令时,这个命令可能会先从文件读取数据,经过处理之后,再将数据输出到屏幕上。输出可以分为标准输出(standard output)和标准错误输出(standard error output)。
- 标准输出与标准错误输出
标准输出指的是命令是指命令执行成功所传回来的正确信息,而标准错误输出则是命令执行失败之后所传回来的信息。比如,我使用这个cat命令来展示文件信息,如果被展示的文件存在,则会将文件的内容输出到屏幕上,而这就是标准输出。如果被展示的文件不存在,则会将错误信息输出到屏幕上,而这就是标准错误输出。如果我们想把正确的信息和错误的信息分开存储到不同的文件中,则可以使用下面这些特殊字符:
- 标准输出(stdout) : 代码为1,使用>或>>。
- 标准错误输出(stderr): 代码为2,使用2>或2>>。
下面是具体的用法:
把ls .
命令输出的信息通过>
(也可以写成1>)存储到dataflow这个文件中,如果dataflow文件存在,则会创建这个文件,并把ls .
命令的输出的信息存储到这个文件中(如果此文件已经有内容则会被覆盖),所有的数据流操作都是如此。如果不想文件内容被覆盖则可以使用下面这个命令。
是里使用>>
(也可以写成1>>)将echo $PATH
输出的信息累加到dataflow
文件中。下面是标准错误输出的用法。
使用2>
则可以将错误的信息存储到指定的文件中。如果不想指定文件的内容不被覆盖则可以使用2>>
,把错误信息和正确信息存储到一个文件中可以使用&>
。这里就不在多做演示。如果想将正确的信息和错误的信息分别存储不同的文件中则可以使用下面这个用法。
find /home -name .bashrc
命令会查找/home
目录是否有.bashrc
文件的存在。因为该命令会检查所有指定目录下的文件,而这些文件不一定有足够的权限可以访问,所以可能会引发权限不足的错误信息。在这个用法中,使用>
将正确的信息存储到RightInfo中,把错误的信息存储到ErrorInfo中。
/dev/null信息垃圾桶设备
这个设备的用处是用是,如果你不想错误信息输出到屏幕上,并且也不存储到文件中,就可以将信息输出到这个设备中。这个设备会将错误信息吃掉。下面是用法:
参考
《鸟哥的Linux私房菜》