원하는 출력

원하는 출력

부모 중간 어딘가에 있는 다른 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동의어임) 다음과 같습니다.

이름: dot - 현재 환경에서 명령을 실행합니다.
요약: . file
설명: 쉘은 현재 환경에서 파일에 있는 명령을 실행해야 합니다.

게다가실행 환경다음을 포함하도록 정의됩니다.

변수 할당(특수 내장 설정 참조) 또는 [environment]를 통해 설정된 쉘 매개변수

"변수 할당으로 설정"은 쉘이 시작될 때 처음에 위치 인수(매개변수)가 할당되는 방식과 실제로 일치하지 않는 것 같지만 "설정"에 대한 참조는 해당 항목이 set포함되어야 함을 암시하는 것 같습니다. 어쨌든, 내가 찾은 모든 껍질에는 그것들이 포함되어 있었습니다.

따라서 쉘을 변경하는 것은 작동하지 않을 것 같지만 몇 가지 옵션이 있습니다.

  • 매개변수 설정을 해제하면 됩니다 set --. 그러나 더 이상 기본 셸에서 사용할 수 없습니다. Bash/ksh/zsh에서는 먼저 배열에 저장할 수 있지만 args=("$@")물론 배열은 소스 스크립트에 표시됩니다.

  • 함수에는 자체 매개변수 세트가 있으므로 함수 내에서 ./를 실행하세요. and then 과 source비슷한 것 입니다. 비록 이것이 소스 파일의 이름을 .source() { . "$1"; }source script.sh$1source() { 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 --

스크립트를 받기 전에.

관련 정보