Bash
退出 0 的 bash 源 script.sh
我在腳本中使用了很多外部文件。
但是我有一個問題,如果我在文件
exit
內容中獲取一個文件,則腳本退出載入並且我想要使用的字元串消失了。範例
main.sh
:#!/bin/bash clear; source /opt/external-svn/config.sh; echo "$var1 and $var2 and $var3";
範例
config.sh
:#!/bin/bash var1="foo bar is great" var2="foooo baar is greater" var3="foooooooo baaaaaar is \ to long" exit 0
問題是多行
var3
,所以我想使用 source forvar1
andvar2
。以下是可能的,但不是很好:var1=$(cat "/opt/external-svn/config.sh" |awk -F'"' '/^var1/ {print $2}');
這僅適用於單行,不適用於
var3
.有沒有簡單/容易的解決方案?
更新,因為我愚蠢地做出正確的答案
@Gilles no not working the file in raw 在這裡尋求建議 raw.githubusercontent.com/gorgone/temptest/master/config.sh
#!/bin/bash FILE="/tmp/$(basename $0).$$.tmp" configsh="/opt/external-svn/config.sh" grep -vE '^exit' $configsh > $TFILE source "$TFILE"
退出主腳本並在螢幕上顯示迴聲
@Anthon 它也不適用於我在 github 上的文件
Update2 找到解決方案
我找到了神奇的 ONE 我使用了這個想法,但它不是一個通用的解決方案
僅適用於我的特殊情況
cat config.sh |sed 's/if [ $# = 0 ]/if [ $# = 1 ]/g' >config.source
所以我可以獲取文件
但最好的方法是為所有文件提供通用解決方案
如果您有
abc.inc
:x=1 exit 0
和
klm.inc
:y=2 exit 0
那麼如果你有
combine
腳本:#!/bin/bash for fn in abc klm; do grep -vE '^exit' $fn.inc > /tmp/xyz.tmp source /tmp/xyz.tmp done echo x: $x echo y: $y
您可以執行
combine
並獲取輸出:x: 1 y: 2
這假設您的
exit
語句位於行首,grep
如果不是,您可能需要調整
您可以通過
exit
在.main.sh``exit``main.sh
#!/bin/bash # main.sh exit() { local exit_code="${1-?}" test "$exit_code" -ne 0 && builtin exit "$exit_code" : } clear; source /opt/external-svn/config.sh; echo "$var1 and $var2 and $var3"; #unset -f exit; exit 0 builtin exit 0