bash源文件的末尾有退出命令

时间:2018-08-28 17:12:10

标签: bash shell

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,有没有办法解决此问题?

2 个答案:

答案 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