我在另一个 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 显式传递任何所需的数据。