Home Shell 单行执行多个命令
Post
Cancel

Shell 单行执行多个命令

基本的方式

使用 ;&&||

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. 每条命令的结尾必须加 ; ,否则语法错误

{}的示例:

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; }

This post is licensed under CC BY 4.0 by the author.