zoukankan      html  css  js  c++  java
  • Linux 多命令语句与重定向

    多命令语句

    Linux中我们在shell输入命令一般是一条一条执行,但是我们同样可以用一行语句写出多命令,下面就举出几个常见的方法


    “;”分号用法

    方式:command1 ; command2

    用;号隔开每个命令, 每个命令按照从左到右的顺序,顺序执行, 彼此之间不关心是否失败, 所有命令都会执行。

    例如:

    root@Ksha:~/桌面/test# ls
    1.txt  2.txt
    
    root@Ksha:~/桌面/test# ls -l 1.txt;ls -l 2.txt
    -rwxrw-rw- 1 root root 0 8月   3 14:37 1.txt
    -rwxrw-rw- 1 root root 0 8月   3 14:37 2.txt
    
    root@Ksha:~/桌面/test# ls -l 3.txt;ls -l 2.txt
    ls: 无法访问'3.txt': 没有那个文件或目录
    -rwxrw-rw- 1 root root 0 8月   3 14:37 2.txt

    首先我们可以看到test文件夹里面只有两个文件

    第二条命令 

    ls -l 1.txt;ls -l 2.txt

    正常执行没问题

    第三条命令

    ls -l 3.txt;ls -l 2.txt

    仍然可以执行,即使目标文件夹没有3.txt文件,并且报错但是不影响该命令后半部分的执行

    这就是分号的作用 命令从左到右顺序执行,无论是否失败,所有命令都会执行


    “| ”管道符用法

    上一条命令的输出,作为下一条命令参数

    方式:command1 | command2

    我们经常使用这条命令来简化一些操作下面举例

    例如我们想查看当前的网络状态 使用命令netstat会发现一下子出来好多数据,那比如我们要查看18565端口的运行情况呢?难道一个一个找吗?

    我们可以使用下面这个命令

    root@Ksha:~/桌面/test# netstat|grep "18565"
    unix  3      [ ]         STREAM     CONNECTED     18565    /var/run/dbus/system_bus_socket

    grep语句可以正则匹配

    我们来看看这条命令 首先netstat显示出网络状态 然后管道符后面的 grep "18565" 则是对于前面的netstat命令得到的结果进行正则匹配 然后显示结果

    所以管道符用法就是上一条命令的输出,作为下一条命令参数

    所以如果两条命令有一个不成立 另一个自然也不会有什么结果


    “&”符号用法

    &放在启动参数后面表示设置此进程为后台进程

    方式:command1 &

    默认情况下,进程是前台进程,这时就把Shell给占据了,我们无法进行其他操作,对于那些没有交互的进程,很多时候,我们希望将其在后台启动,可以在启动参数的时候加一个'&'实现这个目的。


    “&&”符号用法

    shell 在执行某个命令的时候,会返回一个返回值,该返回值保存在 shell 变量 $? 中。当 $? == 0 时,表示执行成功;当 $? == 1 时(我认为是非0的数,返回值在0-255间),表示执行失败。

    有时候,下一条命令依赖前一条命令是否执行成功。如:在成功地执行一条命令之后再执行另一条命令,或者在一条命令执行失败后再执行另一条命令等。

    语法格式如下:

    command1 && command2 [&& command3 ...]

    命令之间使用 && 连接,实现逻辑与的功能。 

    只有在 && 左边的命令返回真(命令返回值 $? == 0),&& 右边的命令才会被执行。 

    只要有一个命令返回假(命令返回值 $? == 1),后面的命令就不会被执行。

    root@Ksha:~/桌面/test# ls -l 3.txt&&ls -l 2.txt
    ls: 无法访问'3.txt': 没有那个文件或目录

    例如此条命令 因为该文件没有3.txt文件,所以后面的ls -l 2.txt命令也不会执行


     “||”符号用法

     “||”符号用法则是逻辑”或“

    语法格式如下:

    command1 || command2 [|| command3 ...]

    命令之间使用 || 连接,实现逻辑或的功能。 

    root@Ksha:~/桌面/test# ls -l 1.txt||ls -l 2.txt
    -rwxrw-rw- 1 root root 0 8月   3 14:37 1.txt
    root@Ksha:~/桌面/test# ls -l 3.txt||ls -l 2.txt
    ls: 无法访问'3.txt': 没有那个文件或目录
    -rwxrw-rw- 1 root root 0 8月   3 14:37 2.txt

    我们来分析下这两条命令 第一条的前半部分已经可以执行,所以不执行后半命令;第二条命令前半部分不可执行,所以尝试执行后半部分的命令

    从结果来看,”||"作用就是命令从左至右若有一条命令可以执行,之后的命令就都不执行


     

    Shell 输入/输出重定向

    大多数 UNIX 系统命令从你的终端接受输入并将所产生的输出发送回​​到您的终端。一个命令通常从一个叫标准输入的地方读取输入,默认情况下,这恰好是你的终端。同样,一个命令通常将其输出写入到标准输出,默认情况下,这也是你的终端。

    重定向命令列表如下:

    命令说明
    command > file 将输出重定向到 file。
    command < file 将输入重定向到 file。
    command >> file 将输出以追加的方式重定向到 file。
    n > file 将文件描述符为 n 的文件重定向到 file。
    n >> file 将文件描述符为 n 的文件以追加的方式重定向到 file。
    n >& m 将输出文件 m 和 n 合并。
    n <& m 将输入文件 m 和 n 合并。
    << tag 将开始标记 tag 和结束标记 tag 之间的内容作为输入。

    需要注意的是文件描述符 0 通常是标准输入(STDIN),1 是标准输出(STDOUT),2 是标准错误输出(STDERR)。


     

    输出重定向

    重定向一般通过在命令间插入特定的符号来实现。特别的,这些符号的语法如下所示:

    command1 > file1

    上面这个命令执行command1然后将输出的内容存入file1。

    例如我们直接执行命令 netstat -pantu

    root@Ksha:~/桌面/test# netstat -pantu
    Active Internet connections (servers and established)
    Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name    
    udp        0      0 0.0.0.0:68              0.0.0.0:*                           606/dhclient       

    那么我们想让这些结果保存在文件中怎么办

    可以执行

    root@Ksha:~/桌面/test# netstat -pantu>3.txt

    执行后,并没有在终端输出信息,这是因为输出已被从默认的标准输出设备(终端)重定向到指定的文件。

    我们打开3.txt看下结果

    注意任何file1内的已经存在的内容将被新内容替代。如果要将新内容添加在文件末尾,请使用>>操作符。


    输入重定向

    和输出重定向一样,Unix 命令也可以从文件获取输入,语法为:

    command1 < file1

    这样,本来需要从键盘获取输入的命令会转移到文件读取内容。

    注意:输出重定向是大于号(>),输入重定向是小于号(<)。

    例如我们先在3.txt中写上几个文件名

     然后我们执行命令:

    root@Ksha:~/桌面/test# ls -l<3.txt
    总用量 4
    -rwxrw-rw- 1 root root  0 8月   3 14:37 1.txt
    -rwxrw-rw- 1 root root  0 8月   3 14:37 2.txt
    -rw-r--r-- 1 root root 18 8月   4 18:15 3.txt

    发现会该命令会直接读取3.txt中我们刚写入的几个文件名

    我们还可以同时替换输入和输出,执行command1,从文件infile读取内容,然后将输出写入到outfile中。

    command1 < infile > outfile

    可以自己多尝试练习


    ">&"组合使用

    >&可以起到合并输出的效果

    一般情况下,每个 Unix/Linux 命令运行时都会打开三个文件:

    • 标准输入文件(stdin):stdin的文件描述符为0,Unix程序默认从stdin读取数据。
    • 标准输出文件(stdout):stdout 的文件描述符为1,Unix程序默认向stdout输出数据。
    • 标准错误文件(stderr):stderr的文件描述符为2,Unix程序会向stderr流中写入错误信息。

    默认情况下,command > file 将 stdout 重定向到 file,command < file 将stdin 重定向到 file。

    2 表示标准错误文件(stderr)。

    如果希望将 stdout 和 stderr 合并后重定向到 file,可以这样写:

    command > file 2>&1

    例如 如果我们直接执行下面这个命令(当前目录不存在4.txt)

    root@Ksha:~/桌面/test# ls -l 3.txt 4.txt>5.txt
    ls: 无法访问'4.txt': 没有那个文件或目录

    会发现首先命令行中提示一个错误 并且在5.txt中有一个输出

    那么我们不想错误文件出现在命令行而是跟结果一起出现在5.txt中怎么办?

    我们可以执行这个命令:

    root@Ksha:~/桌面/test# ls -l 3.txt 4.txt>5.txt 2>&1

    会发现此时并没有报错我们再打开5.txt看看里面是什么

    好的我们已经实现了这个功能

    多命令语句与重定向结合使用需要多练习才会熟练的运用

  • 相关阅读:
    转载:SqlServer数据库性能优化详解
    复杂事件处理技术概览(一)
    Netty : writeAndFlush的线程安全及并发问题
    如何在RCP程序中添加一个banner栏
    AChecker + Selenium2对需要登录的页面进行自动化可访问性测试
    5分钟开启Esper之旅
    使SWT/JFace支持跨平台
    Ubuntu上Docker安装Trouble Shooting
    使Docker Container支持运行SWT程序
    Xcode5中如何切换Storyboards为xib
  • 原文地址:https://www.cnblogs.com/CYHISTW/p/11299200.html
Copyright © 2011-2022 走看看