所需输出

所需输出

我在另一个 bashscript(父级)中获取了一个 bashscript(子级),位于父级中间的某个位置。执行时传递给父级的参数将传递给子级。我怎样才能防止这种行为?我不希望父母的争论也转移到孩子身上。

笔记: 父子类比不是关于父子过程,而是关于先于另一个的事情。

另外,我希望为源脚本提供父脚本的环境(除了传递给它的参数)。这是因为,脚本参数的默认值不同。请参见下面的示例。 父脚本使用源脚本中定义的一些函数,并且源脚本还创建父脚本正在使用的数组。另外,在获取子脚本之后,我需要父脚本的位置参数。

#!/usr/bin/env bash
# - goal: "Parent"

main() {
    # # Path
    #dScriptP="$(dirname "$(readlink -f "${BASH_SOURCE[0]}")")"

    # # Argument
    ParentArgument=${1:-40}
    echo "ParentArgument=${ParentArgument}"
    . Child.sh

}

main "$@"
#!/bin/false
# shellcheck shell=bash
# - goal: "Child"

main() {
    # # Path
    #dScriptP="$(dirname "$(readlink -f "${BASH_SOURCE[0]}")")"

    # # Argument
    ChildArgument=${1:-30}
    echo "ChildArgument=${ChildArgument}"
}

main "$@"
$ ./Parent.sh 50
ParentArgument=50
ChildArgument=50

所需输出

$ ./Parent.sh 50
ParentArgument=50
ChildArgument=30

答案1

POSIX 描述.“公用事业”(巴什的source是同义词)如下:

名称:点 - 在当前环境中执行命令
概要: . file
描述:shell 应在当前环境中执行文件中的命令。

还有执行环境被定义为包括:

通过变量赋值设置的 Shell 参数(请参阅设置特殊内置)或来自[环境]

“通过变量赋值设置”似乎并不真正匹配位置参数(参数)在 shell 启动时最初分配的方式,但对 的引用set似乎暗示应该包含它们。无论如何,我能找到的所有贝壳都包括它们。

因此,更改 shell 不太可能起作用,但您有一些选择:

  • 只需取消设置参数即可set --。但此后它们也将无法在主 shell 中使用。在 Bash/ksh/zsh 中,您可以先将它们保存在数组中,args=("$@")但当然该数组对源脚本是可见的。

  • 在函数中运行./ ,因为函数有自己的参数集。source类似于source() { . "$1"; }and then 的东西source script.sh,尽管这会使源文件的名称在$1.尽管这可以解决,但在 Bash 中您可以使用source() { local f=$1; shift; . "$f"; };.

  • 在 Bash/ksh/zsh 中,您可以将自己的参数添加到./ source,在这种情况下,只有它们可用于源脚本。源. script.sh foo脚本只能foo$1.但是您不能以这种方式传递空参数列表。

  • 话又说回来,如果你不想让其他脚本看到主脚本的环境,那么获取它,但将其作为命令运行,通过脚本参数 stdin 和 stdout 显式传递任何所需的数据。

答案2

您可以使用 POSIXly 移动位置参数shift [n]命令(感谢@ilkkachu)其中n是要移动的参数数量(默认为1)。要取消设置所有参数,您可以使用以下命令移动所有参数

shift $#

在您获取脚本之前。

更改(设置或取消设置)位置参数的 POSIXly 方法是使用set命令。要取消设置所有位置参数,您可以使用

set --

在获取脚本之前。

相关内容