function p(){
echo $$
exit 55
}
if ! [ `p` ];then
echo bbbb
else
echo pppppppppppp
fi
利用命令替换获取函数p的返回值(由echo提供),而后利用 [ ] 进行判断
在执行函数p的时候,没有因为exit 55 退出整个脚本,而是打印了pppppppp,所以据此判断shell中命令引用是开辟了一个新的shell进程来执行命令引用,所以命令引用中的exit不会影响到父shell
function p(){
echo $$
exit 55
}
if ! p;then
echo bbbb
else
echo pppppppppppp
fi
直接用函数p的exit code : 55进行判断,但是函数p中包含了exit,结束了当前shell进程,所以整个shell脚本退出了,故此种方式函数p的执行是在当前shell进程,跟命令引用是不同的
所以改为return
function 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进程,这个时候不能通过变量 $ 进行判断了
原文:https://www.cnblogs.com/dissipate/p/13873023.html