cat >file1.sh <<'EOF_FILE1'
echo 'before source'
source 'file2.sh'
echo 'after source'
func1
EOF_FILE1
cat >file2.sh <<'EOF_FILE2'
echo 'test script'
func1() {
echo 'func1 starts'
exit
}
exit
EOF_FILE2
bash file1.sh
预期输出为:
before source
test script
after source
func1 starts
实际输出为:
before source
test script
由于使用exit
命令,因此缺少“源之后”。由于无法从代码中删除exit
,有没有办法解决此问题?
答案 0 :(得分:1)
source
在运行file2.sh
的同一shell中执行file1.sh
。
您可能想改用bash
命令,以便产生一个新的shell来执行file2.sh
:
echo 'before source'
bash file2.sh
echo 'after source'
OR
如@CharlesDuffy in the comments所建议,您可以使用(source file2.sh)
在子shell中获取file2.sh
。这样可以隔离子流程中的代码,但是可以像访问其他source
d'脚本一样访问未导出的shell变量。它还消耗更少的资源。
echo 'before source'
(source file2.sh)
echo 'after source'
答案 1 :(得分:1)
最佳方法是编写旨在获取源代码而不是在考虑用例的情况下执行的脚本,如果由于某种原因而不能这样做,则可以考虑{{ 1}}在import React, { Component } from 'react';
import { View, Text, TouchableOpacity } from 'react-native';
import Styles from 'app/constants/Styles'
import Vars from 'app/constants/Vars'
export default class Button extends Component {
render() {
return (
<TouchableOpacity style={[Styles.round, Styles.primaryBackground]} onPress={this.props.onPress}>
<Text style={[Styles.label, Styles.textCenter, { margin: Vars.spacing.narrow }]}>
{this.props.label}
</Text>
</TouchableOpacity>
)
}
}
命令之前将alias
移至exit
,如下所示:
return
如果您希望函数中的source
在调用该函数时仍然有效,则可以使事情变得更加复杂:
shopt -s expand_aliases # enable alias expansion (off by default in noninteractive shells)
alias exit=return # ...and alias 'exit' to 'return'
source 'file2.sh' # source in your file which incorrectly uses 'exit' at top-level
unalias exit # disable the alias...
echo 'after source'
func1