管道符号,重定向符号,连接符号等用法

359 阅读3分钟

1/重定向:“>”、“>>”、“<”

 重定向就是使命令改变它原来的标准输出
 本来可能是输出到控制台,或者根据logger.info输出到指定的文件。
 用了重定向符号之后可以输出到另外的地方。
 “>”可将结果输出到文件中,该文件原有内容会被删除,
 “>>”则将结果附加到文件中,原文件内容不会被删除。
 “<”可以改变标准输入。
 如:  
    cat data1.txt >> data2.txt
    将data1.txt文件的内容追加在data2.txt文件的后面
    如果是cat data1.txt > data2.txt   则会覆盖掉data2.txt中的内容

2/管道符号

  前一个命令的输出,是下一个命令的输入
  man mtools | grep mbadblocks 
  在mtools的帮助中搜索包含“mbadblocks”的句子) 

  man mtools | less
  把输出用管道导入到一个叫做 less 的工具。
  less 是一个分页工具,它允许你一页一页地查看信息。
  
  ps aux | grep python  
  # 查找目前正在执行的python进程
  
  netstat -tunlp | grep xxx 
  # 查看端口号的占用情况
     
       

3/连接符号:“;”

   当有几个命令要连续执行时,我们可以把它们放在一行内,中间用“;”分开。  
   mkdir myfile ; cp /tmp/myfile.txt myfile
   (先建立一个目录myfile,然后把myfile.txt拷贝到新建的目录中) 
   某个命令的执行失败不会影响接下来的命令的执行。
   如果某个命令执行失败,则接着执行接下来的命令,也就是说不会影响接下来的命令。

4/后台执行:“&”

   用户有时候执行命令要花很长时间,可能会影响做其他事情,或者晚上下班了,我们需要关闭服务器终端,
   但是我们依然希望程序正常
   最好的方法是将它放在后台执行。
   后台运行的程序在用户注销后系统(也就是服务器断开)还可以继续执行。
   当要把命令放在后台执行时,在命令的后面加上“&”。 
   
   这样也有一个问题:如果程序中有输出,则会输出到控制台,如这个时候我们在用服务器,则可能会对我们的工作造成一定的影响。
   
   所以可以用nohup python xxx.py & 这样会把输出写入到nohup.out文件中。
   当然如果我们指定输出的文件,如nohup python xxx.py > 111.txt &  则不会把输出倒入到nohup.out文件中    
   
 

5/ shell中的 && 命令

   有时候,下一条命令依赖前一条命令是否执行成功。
   如:在成功地执行一条命令之后再执行另一条命令,或者在一条命令执行失败后再执行另一条命令等。   
   
   shell 提供了 && 和 || 来实现命令执行控制的功能,shell 将根据 && 或 || 前面命令的返回值来控制其后面命令的执行。 
   
   语法格式如下: 
   command1 && command2 [&& command3 ...] 
   1 命令之间使用 && 连接,实现逻辑与的功能。 
   2 只有在 && 左边的命令返回真(命令返回值 $? == 0),&& 右边的命令才会被执行。 
   3 只要有一个命令返回假(命令返回值 $? == 1),后面的命令就不会被执行。 
     

6/ sheel中的||命令

   语法格式如下: 
   command1 || command2 [|| command3 ...] 
   1 命令之间使用 || 连接,实现逻辑或的功能。 
   2 只有在 || 左边的命令返回假(命令返回值 $? == 1),|| 右边的命令才会被执行。
   3 只要有一个命令返回真(命令返回值 $? == 0),后面的命令就不会被执行。 
   
     

7/ nohup command &

 >nohup ./start-dishi.sh > output 2>&1 &
 解释:
 1. 带&的命令行,即使terminal(终端)关闭,或者电脑死机程序依然运行(前提是你把程序递交到服务器上); 
 2. 2>&1的意思 
  这个意思是把标准错误重定向到标准输出中),而标准输出又导入文件output里面,
  所以结果是标准错误和标准输出都导入文件output里面了。 
  至于为什么需要将标准错误重定向到标准输出的原因,那就归结为标准错误没有缓冲区,而stdout有。
  这就会导致 >output 2>output 文件output被两次打开,而stdoutstderr将会竞争覆盖,这肯定不是我门想要的. 
  这就是为什么有人会写成: nohup ./command.sh >output 2>output出错的原因了 
  
  如果使用nohup命令提交作业,那么在缺省情况下该作业的所有输出都被重定向到一个名为nohup.out的文件中,除非另外指定了输出文件,像下面这样 nohup command > myout.file 2>&1 &