我在另一个 bashscript (Parent) 中获取一个 bashscript (Child),位于 Parent 中间的某个位置。执行时传递给 Parent 的参数会传递给 Child。如何防止这种行为?我不希望父母的论点也转移给孩子。
注意:父子类比不是关于父子过程,而是关于先于另一个的东西。
此外,我想拥有源脚本的父脚本环境(传递给它的参数除外)。这是因为,脚本参数的默认值不同。请参见下面的示例。 父脚本使用源脚本中定义的一些函数,并且源脚本创建父脚本正在使用的数组。另外,在获取子脚本后,我需要父脚本的位置参数。
#!/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
shift [n]
您可以使用命令(感谢@ilkkachu)POSIXly 移位位置参数,其中n
是要移位的参数数量(默认为 1)。要取消设置所有参数,您可以使用在您获取脚本之前。
更改(设置或取消设置)位置参数的 POSIXly 方法是使用
set
命令。要取消设置所有位置参数,您可以使用在获取脚本之前。
.
“实用程序”(Bashsource
是同义词)的POSIX 描述如下:并且执行环境被定义为包括:
“通过变量赋值设置”似乎与在 shell 启动时最初分配位置参数(参数)的方式并不匹配,但对的引用
set
似乎暗示它们应该被包括在内。无论如何,我能找到的所有贝壳都包括它们。因此,更改 shell 不太可能奏效,但您有一些选择:
只需取消设置参数,使用
set --
. 但是在那之后它们也不会在主shell中可用。在 Bash/ksh/zsh 中,您可以先将它们保存在一个数组中args=("$@")
,但当然该数组对源脚本是可见的。在函数中运行
.
/source
,因为函数有自己的一组参数。类似于source() { . "$1"; }
然后的东西source script.sh
,尽管这会使源文件的名称在$1
. 虽然这可以解决,但在 Bash 中你可以使用source() { local f=$1; shift; . "$f"; };
.在 Bash/ksh/zsh 中,您可以将自己的参数添加到
.
/source
,在这种情况下,只有它们可用于源脚本。后. script.sh foo
源脚本只会foo
在$1
. 但是你不能以这种方式传递一个空的参数列表。再说一次,如果您不希望其他脚本看到主脚本的环境,则不要获取它,而是将其作为命令运行,并通过脚本参数 stdin 和 stdout 显式传递任何所需的数据。