基本的方式
使用 ;
和 &&
和 ||
1
2
3
4
5
ls && pwd # 第一个执行成功,返回0了,再执行第二个
ls || pwd # 执行到第一个成功的就结束了,ls执行成功,pwd这里不会执行
ls ; pwd # 顺序执行ls 和 pwd 命令
这里的命令其实都是会fork一个子进程去执行的
使用括号的方式
使用 {}
和 ()
,在同一个bash环境中一次执行多个命令:
多条命令执行
(1)单小括号,(cmd1;cmd2;cmd3) 新开一个子shell顺序执行命令cmd1,cmd2,cmd3, 各命令之间用分号隔开, 最后一个命令后可以没有分号。
(2)单大括号,{ cmd1;cmd2;cmd3;} 在当前shell顺序执行命令cmd1,cmd2,cmd3, 各命令之间用分号隔开, 最后一个命令后必须有分号, 第一条命令和左括号之间必须用空格隔开。
对{}和()而言, 括号中的重定向符只影响该条命令, 而括号外的重定向符影响到括号中的所有命令。
注意语法:
{}
中需要开头加一个空格的! , 而()
可以不加,也可以加- 每条命令的结尾必须加
;
,否则语法错误
{}
的示例:
1
2
3
4
5
6
7
pjw@hw-cpr:~/Templates$ { ls;pwd} # 最后一个命令没有 ; 会认为是要续行,不行
>
pjw@hw-cpr:~/Templates$ {ls;pwd;} # {} 里面开头第一个不是空格,不行
-bash: syntax error near unexpected token '}'
pjw@hw-cpr:~/Templates$ { ls;pwd;} # 可以
testdir1 testdir2
/home/pjw/Templates
()
的示例,()语法比较宽松
1
2
3
4
5
6
7
8
9
pjw@hw-cpr:~/Templates$ (ls;pwd) # () 比较宽松,最后一个命令没有; ,第一个不是空格也不报错
testdir1 testdir2
/home/pjw/Templates
pjw@hw-cpr:~/Templates$ (ls;pwd;)
testdir1 testdir2
/home/pjw/Templates
pjw@hw-cpr:~/Templates$ ( ls;pwd;)
testdir1 testdir2
/home/pjw/Templates
最好保持统一的形式 都使用 {}
的要求, { Cmd1;Cmd2;…Cmdn; }