双用bash脚本 - 源码也是exec子shell?动态返回/退出?

时间:2018-03-08 00:04:07

标签: linux bash shell

我当前的设置以表面上处于.bashrc(准确地为.bash_it/custom/funcs.bash)的函数开始

#!/usr/bin/env bash
function proset() {
  . proset-core "$@";
}

proset-core对秘密进行一些解密并将这些秘密导出到会话中,因此需要.而不是仅将其作为脚本/子shell运行。

如果proset-core出现问题,我使用return代替exit,因为我不希望删除SSH连接。

if [ "${APP_JSON}" = "null" ] ; then
  echo -e "\n${redtext}App named $NAME not found in ${APPCONF}. Aborting.${resettext}\n";
  return;
fi

这在导出的proset函数的上下文中是有意义的,但是排除了用作脚本的用法,因为return除了函数内部之外无效。

有没有办法检测它是如何被调用的并且适当地返回一个或另一个?

3 个答案:

答案 0 :(得分:2)

如果失败,只需尝试dadd - invalid, dadD - also invalid, dada - valid, 1121 - invalid, 1122 - valid return

exit

在顶级(函数外部)调用_retval=$? return 2>/dev/null || exit "$_retval" 之后,代码仍将继续的唯一情况是,如果您执行了而不是源代码,并且应该发生这种情况,{{1}是正确的事。

答案 1 :(得分:1)

将$ @ args的内置变量$ SHLVL作为最后一个arg。然后在测试点:

if [ "${@: -1}" -lt $SHLVL ]; then
    # SHLVL arg is less than current SHLVL
    # we are in a subshell
    exit
else
    return
fi 

答案 2 :(得分:0)

结束使用

calledBy="$(ps -o comm= $PPID)";
if [ "x${calledBy}" = "xsshd" ]; then
  return 1;
else
  exit 1;
fi

因为它不需要传递任何额外的东西。任何可能导致此问题的请注释。不太担心是特定于bash还是便携式。

信用:get the name of the caller script in bash script