bash脚本:如何从源脚本“退出”,并允许非源工作?

时间:2019-10-04 14:59:04

标签: bash

我有一个脚本,希望人们提供,但也可以选择。因此他们可以运行它,无论是否采购它,都取决于他们。

例如以下两项都应该起作用:

$ . test.sh $ test.sh

问题是,如果未传递正确的args,test.sh包含exit语句。如果有人提供了脚本,那么exit命令将退出终端!

我做了一些研究,发现from this StackOverflow post可以检测出它是否是来源,并且做了一些不同的事情,但是那会有什么不同呢?

2 个答案:

答案 0 :(得分:1)

可能有更好的方法来执行此操作,但是以下示例脚本显示了如何使它工作:

bparks@home 
$ set | grep TESTVAR

bparks@home 
$ ./test.sh

  Outputs some useful information to the console. Please pass one arg.

bparks@home 
$ set | grep TESTVAR

bparks@home 
$ . ./test.sh

  Outputs some useful information to the console. Please pass one arg.

bparks@home 
$ set | grep TESTVAR

bparks@home 
$ ./test.sh asdf
export TESTVAR=me

bparks@home 
$ set | grep TESTVAR

bparks@home 
$ . ./test.sh asdf

bparks@home 
$ set | grep TESTVAR
TESTVAR=me

bparks@home 
$

test.sh

#!/usr/bin/env bash

# store if we're sourced or not in a variable
(return 0 2>/dev/null) && SOURCED=1 || SOURCED=0

exitIfNotSourced(){
  [[ "$SOURCED" != "0" ]] || exit;
}

showHelp(){
  IT=$(cat <<EOF

  Outputs some useful information to the console. Please pass one arg.

EOF
  )
  echo "$IT"
}

# Show help if no args supplied - works if sourced or not sourced
if [ -z "$1" ]
then
  showHelp

  exitIfNotSourced;
  return;
fi

# your main script follows 
# this sample shows exporting a variable if sourced, 
# and outputting this to stdout if not sourced

if [ "$SOURCED" == "1" ]
then
  export TESTVAR=me
else
  echo "export TESTVAR=me"
fi

答案 1 :(得分:1)

从源脚本退出的正常方法是简单地转到任何功能之外的return(可选地添加所需的退出代码)。假设以命令方式运行时,我们设置了-e标志,那么它也会从shell程序中退出:

#!/bin/sh -eu

if [ $# = 0 ]
then
    echo "Usage $0 <argument>" >&2 
    return 1
fi

如果我们在没有-e的情况下运行,则可以改为return || exit