Bash

防止 bashscript 參數被轉移到子源腳本

  • September 15, 2019

我在另一個 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 --

在獲取腳本之前。

引用自:https://unix.stackexchange.com/questions/541878