最近在看《Linux Shell编程从入门到精通》这书,把之前朦胧的知识再巩固一下,作些记录。
一,&和&&,|和||区别
& 表示任务在后台执行,如要在后台运行redis-server,则有 redis-server &
&& 表示前一条命令执行成功时,才执行后一条命令 ,如 echo 'hello‘ && echo 'nihao'
| 表示管道,上一条命令的输出,作为下一条命令参数,如 echo 'hello' | wc -l
|| 表示上一条命令执行失败后,才执行下一条命令,如 cat nofile || echo "failed"
二,2>&1的意思
Linux 中三种标准输入输出,分别是STDIN,STDOUT,STDERR,对应的数字是0,1,2。
STDIN就是标准输入,默认从键盘读取信息;STDOUT是标准输出,默认将输出结果输出至终端,也就是显示器之类的东西;STDERR是标准的错误信息,默认也会显示在终端上。由于STDOUT与STDERR都会默认显示在终端上,为了区分二者的信息,就有了编号的0,1,2的定义,用1表示STDOUT,2表示STDERR。
command > a ---等于 command 1> a ,默认即为标准输出,错误输出会到当前终端。
command > a 2> a ---分别定义标准输出和标准错误输出,打开文件两次。
command > a 2>&1 ---&1的含义就可以理解为用标准输出的引用,打开文件一次。
cat 0< ps.sh 2>&1 > testfunc.sh ---将ps.sh作为输入,标准和错误输出到testfunc.sh。
cat 0< ps.sh 2>&1 > testfunc.sh ---等于 cat < ps.sh 2>&1 > testfunc.sh,标准输入为0.
cat 0< ps.sh &> testfunc.sh ---&> 这个符号,就包含了标准和错误输出,好像和2>&1类似。
'>'只能将正常信息重定向, 与 1> 相同
'&>'可以将错误信息或者普通信息都重定向输出
2>&1 意思是把 标准错误输出 重定向到 标准输出.
&>file 意思是把标准输出 和 标准错误输出 都重定向到文件file中
grep da * > greplog1
grep da * > greplog2 1>&2
grep da * > greplog3 2>&1 //grep da * 2> greplog4 1>&2 结果一样
#查看greplog1会发现里面只有正常输出内容
#查看greplog2会发现里面什么都没有
#查看greplog3会发现里面既有正常输出内容又有错误输出内容
三,/dev/null和/dev/zero
把/dev/null看作”黑洞”, 它等价于一个只写文件,所有写入它的内容都会永远丢失.,而尝试从它那儿读取内容则什么也读不到。然而, /dev/null对命令行和脚本都非常的有用。
像/dev/null一样, /dev/zero也是一个伪文件, 但它实际上产生连续不断的null的流(二进制的零流,而不是ASCII型的)。 写入它的输出会丢失不见, 而从/dev/zero读出一连串的null也比较困难, 虽然这也能通过od或一个十六进制编辑器来做到。
/dev/zero主要的用处是用来创建一个指定长度用于初始化的空文件,就像临时交换文件。
#!/bin/bash
# 创建一个交换文件.
ROOT_UID=0 # Root 用户的 $UID 是 0.
E_WRONG_USER=65 # 不是 root?
FILE=/swap
BLOCKSIZE=1024
MINBLOCKS=40
SUCCESS=0
# 这个脚本必须用root来运行.
if [ "$UID" -ne "$ROOT_UID" ]
then
echo; echo "You must be root to run this script."; echo
exit $E_WRONG_USER
fi
blocks=${1:-$MINBLOCKS} # 如果命令行没有指定,
if [ "$blocks" -lt $MINBLOCKS ]
then
blocks=$MINBLOCKS # 最少要有 40 个块长.
fi
echo "Creating swap file of size $blocks blocks (KB)."
dd if=/dev/zero of=$FILE bs=$BLOCKSIZE count=$blocks # 把零写入文件.
mkswap $FILE $blocks # 将此文件建为交换文件(或称交换分区).
swapon $FILE # 激活交换文件.
echo "Swap file created and activated."
exit $SUCCESS
四,nohup和&
nohup命令可以将以忽略挂起信号的方式运行起来,被运行的程序的输出信息将不会显示到终端。无论是否将nohup命令的输出重定向到终端,输出都将附加到当前目录下的nohup.out文件中。如果当前目录的nohup.out文件不可写,输出重定向到$HOME/nohup.out文件中。如果没有文件能创建或打开以用于追加,那么command参数指定的命令不可调用。如果标准错误是一个终端,那么把指定的命令写给标准错误的所有输出作为标准输出重定向到相同的文件描述符。
nohup是永久执行的意思,而 & 是指在后台运行。就是指,用nohup运行的命令或程序可以永久的执行下去,和用户终端没有关系,例如我们断开ssh连接都不会影响他的运行。
- 当我们用 & 运行的程序是守护进程时,我们断开终端后这个守护进程会继续在后台运行。如果这个进程不是守护进程时,当我们断开终端后,这个进程也跟着断开停止运行了。
由于使用nohup时,会自动将输出写入nohup.out文件中,如果文件很大的话,nohup.out就会不停的增大,这是我们不希望看到的,因此,可以利用/dev/null来解决这个问题。
(1)舍弃标准输出,将错误输出到log文件中
nohup node bin/www >/dev/null 2>log &
(2)如果错误信息也不想要的话:
nohup node bin/www >/dev/null 2>&1 &
注:其中node bin/www是项目node启动
参考URL:
https://blog.csdn.net/wufaliang003/article/details/80275055
https://www.cnblogs.com/yanzibuaa/p/7808437.html
https://blog.csdn.net/u014284252/article/details/51784217
https://www.cnblogs.com/kcxg/p/11076461.html
https://blog.51cto.com/ibmcn/2348741
https://msd.misuland.com/pd/3255817963235708312
https://blog.csdn.net/cristik/article/details/82785847