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
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被两次打开,而stdout和stderr将会竞争覆盖,这肯定不是我门想要的.
这就是为什么有人会写成: nohup ./command.sh >output 2>output出错的原因了
如果使用nohup命令提交作业,那么在缺省情况下该作业的所有输出都被重定向到一个名为nohup.out的文件中,除非另外指定了输出文件,像下面这样 nohup command > myout.file 2>&1 &