关于命令组合

&&

  1. 命令之间使用 && 连接,实现逻辑与的功能。
  2. 只有在 && 左边的命令返回真(命令返回值 $? == 0),&& 右边的命令才会被执行。
  3. 只要有一个命令返回假(命令返回值 $? == 1),后面的命令就不会被执行。

||

  1. 命令之间使用 || 连接,实现逻辑或的功能。
  2. 只有在 || 左边的命令返回假(命令返回值 $? == 1),|| 右边的命令才会被执行。这和 c 语言中的逻辑或语法功能相同,即实现短路逻辑或操作。
  3. 只要有一个命令返回真(命令返回值 $? == 0),后面的命令就不会被执行。

两个案例:

案例1

1
killall php-fpm &&  /usr/local/php/sbin/php-fpm

上面这个命令是 杀死php所有进程,并重新启动 php ,但是php进程要是很多,killall 不能立刻杀死所有的进程,后面的php开启也不会执行,这样可能酿成大问题,所以,要想确保万无一失,就用kill -9 杀死pid,再重启,像这样

1
ps -ef |grep php  |grep -v grep |awk '{print $2}'|xargs kill -9 && /www/web/php/sbin/php-fpm

案例2

1
rm ~/Desktop/1.txt && echo "success" || echo "fail"

如果 ~/Desktop 目录下存在文件 1.txt,将输出 success 提示信息;否则输出 fail 提示信息

;

  1. 命令之间使用;,不论前面的命令是否成功,;后面的依旧会执行
  2. 一条命令需要独占一个物理行,如果需要将多条命令放在同一行,命令之间使用命令分隔符(;)分隔。执行的效果等同于多个独立的命令单独执行的效果


{}

  1. 表示在当前 shell 中将多个命令作为一个整体执行。需要注意的是,使用 () 括起来的命令在执行前面都不会切换当前工作目录,也就是说命令组合都是在当前工作目录下被执行的,尽管命令中有切换目录的命令。

示范:

1
2
3
4
5
6
[root@pa1 tmp]#\rm ~/Desktop/1.txt || {cd ~/Desktop/;ls -a;echo "fail"}
rm: cannot remove ‘/root/Desktop/1.txt’: No such file or directory
-bash: cd: /root/Desktop/: No such file or directory #没有这个文件,执行||后面的
. header.html php-fpm.sock
.. hsperfdata_root sess_fc6cleqmbkejpsje96t40q7o86 #ls -a
fail #输出 fail

()

1 括号中的命令将会新开一个子shell顺序执行,所以括号中的变量不能够被脚本余下的部分使用。括号中多个命令之间用分号隔开,最后一个命令可以没有分号,各命令和括号之间不必有空格

====================我是分隔符====================我是分隔符============

关于后台运行

&

窗口关闭后台运行会取消

nohup command &

窗口关闭后台运行继续,会输出一个文件 nohup.out

screen

窗口关闭后台继续运行,比nohup稳定

tmux

tmux 是一款终端复用命令行工具,比screen更复杂但是更稳定,功能更多

查看当前有多少在后台运行的命令

1
2
3
jobs   #列出由ctrl+z,&,nohup命令调到后台的程序

screen -ls #列出当前所有由screen调到后台的程序

后台命令拉到前台继续

拉到前台继续看输出的话,得看你是怎么放到后面的,解铃还需系铃人
有的是& 有的是 nohup 还有screen ,除了screen,这些后台的东西,都可以用fg加 序号继续在前台执行

1
2
3
4
5
screen -r yourname # 回到yourname这个进程

fg #将后台中的命令调至前台继续运行

bg #将一个在后台暂停的命令,变成继续执行

怎么杀死后台运行的

jobs

1
jobs -l #显示后台挂起的程序pid及状态 (kill pid)

screen

1
2
3
screen -ls  #列出当前所有由screen调到后台的程序
screen -r pid (直接ctrl+c退出)
或者直接命令行找到pid ,kill掉

查看某个进程开启的时间

1
ps -o lstart -p  pid

查看这个命令会运行多久?

1
time command

查看这个命令在执行前会做什么?

1
2
3
4
5
6
7
8
9
maybe

[root@pa2 ~]# !maybe
maybe rm -f root.txt
maybe has prevented rm -f root.txt from performing 1 file system operations:

delete /root/root.txt

Do you want to rerun rm -f root.txt and permit these operations? [y/N] y

关于命令行操作

Ctrl + a 跳转到当前命令行行首

Ctrl + e 跳转到当前命令行行尾

!+上次使用的命令行第一个单词 快速调用上次使用的命令行全部内容

Ctrl + r 搜索最近使用的命令并调用

ctrl - k 清除光标右边的内容
ctrl + h 清除光标左边(之前)的内容

mac用户 Ctrl 换为 control