-
shell中if while等后必须接命令,利用命令的exit code作为判断,而其他高级语言是利用return值作为判断
对于非命令变量,可以利用test or [ ] or [[ ]] 进行判断
如果确实需要用命令或函数的返回值作为判断,可以如下function p(){ echo $$ exit 55 } if ! [ `p` ];then echo bbbb else echo pppppppppppp fi
利用命令替换获取函数p的返回值(由echo提供),而后利用 [ ] 进行判断
在执行函数p的时候,没有因为exit 55 退出整个脚本,而是打印了pppppppp,所以据此判断shell中命令引用是开辟了一个新的shell进程来执行命令引用,所以命令引用中的exit不会影响到父shellfunction p(){ echo $$ exit 55 } if ! p;then echo bbbb else echo pppppppppppp fi
直接用函数p的exit code : 55进行判断,但是函数p中包含了exit,结束了当前shell进程,所以整个shell脚本退出了,故此种方式函数p的执行是在当前shell进程,跟命令引用是不同的
所以改为returnfunction p(){ echo $$ return 55 } if ! p;then echo bbbb else echo pppppppppppp fi
函数返回值没有变量接收,直接打印了,exit code 为 55 ,取反后,为真
-
直接ps只会显示当和当前shell关联的进程和其父进程
-
function b(){ echo $$ exit 55 } echo ‘current shell PID: ‘$$ p=`b` echo echo ‘function b PID: ‘$p echo "ps"
命令引用后在函数b中$$依然为 20933,难道命令引用没有开辟子shell吗?
$ 扩展为shell的进程ID。在一个()
子shell,它扩展为当前shell的进程ID,而不是子shell。
shell中的函数凡是输出stdout & stderr的都是返回值,也可以利用echo明确返回
看如下例子:function b(){ "ps" exit 55 } echo ‘current shell PID: ‘$$ p="`b`" echo echo -e ‘function b ps result: \n‘"$p" echo "ps"
明显看到执行函数b的命令引用时,多出 21476 这个子shell进程,这个时候不能通过变量 $ 进行判断了