我有一个脚本,希望人们提供,但也可以选择。因此他们可以运行它,无论是否采购它,都取决于他们。
例如以下两项都应该起作用:
$ . test.sh
$ test.sh
问题是,如果未传递正确的args,test.sh
包含exit
语句。如果有人提供了脚本,那么exit
命令将退出终端!
我做了一些研究,发现from this StackOverflow post可以检测出它是否是来源,并且做了一些不同的事情,但是那会有什么不同呢?
答案 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
$
#!/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
。