在Bash中执行多条命令且不生成子shell的方法
更优的单条命令实现方式
这是shell脚本里很容易踩的小坑,我给你几个优雅的解决方案,既能避免子shell导致的目录问题,又不会重复执行cd:
方案1:用mkdir -p简化逻辑(推荐)
mkdir -p的特性是如果目录已存在,不会报错且返回成功,所以可以直接写成:
mkdir -p folder && cd folder && git clone https://github.com/user/my-project.git
不管目标目录是否存在,这条命令都会:
- 确保
folder目录存在(不存在就创建,存在就跳过) - 进入该目录(只执行一次
cd) - 执行git clone
这个方案最简洁,逻辑清晰,几乎没有冗余操作,是日常场景里的首选。
方案2:用大括号{}代替子shell()
如果你想保留类似最初的||分支逻辑,只需要把生成子shell的()换成不会创建子shell的{}(注意shell语法要求:大括号前后要有空格,结尾要加分号):
cd folder &>/dev/null || { mkdir folder && cd folder; } && git clone https://github.com/user/my-project.git
这样修改后,cd的效果会保留在当前shell中,后续的git clone就能在正确的目录执行,而且不管目录是否存在,cd都只会执行一次:
- 目录存在:
cd成功,跳过||分支,直接执行clone - 目录不存在:进入
||分支,创建目录并cd,再执行clone
方案3:用if结构提升可读性
如果更看重代码可读性,也可以用if...else结构,逻辑一目了然:
if cd folder &>/dev/null; then git clone https://github.com/user/my-project.git else mkdir folder && cd folder && git clone https://github.com/user/my-project.git fi
这个方案虽然不是单行,但逻辑最清晰,适合需要后续扩展复杂逻辑的场景。
内容的提问来源于stack exchange,提问作者Rodrigo Kondo
相关产品推荐
相关产品推荐

