Bash
防止 bashscript 參數被轉移到子源腳本
我在另一個 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
.
“實用程序”(Bashsource
是同義詞)的POSIX 描述如下:名稱:點 - 在目前環境中執行命令
概要:
. file
描述:shell 應在目前環境中執行來自文件的命令。
並且執行環境被定義為包括:
通過變數賦值(參見 set 特殊內置)或從
$$ the environment $$
“通過變數賦值設置”似乎與在 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 顯式傳遞任何所需的數據。
shift [n]
您可以使用命令(感謝@ilkkachu)POSIXly 移位位置參數,其中n
是要移位的參數數量(預設為 1)。要取消設置所有參數,您可以使用shift $#
在您獲取腳本之前。
更改(設置或取消設置)位置參數的 POSIXly 方法是使用
set
命令。要取消設置所有位置參數,您可以使用set --
在獲取腳本之前。