손자 프로세스에 사용할 매개변수 전달

손자 프로세스에 사용할 매개변수 전달

매개변수 목록과 세 가지 프로세스가 있습니다.

bash_script -> child -> grandchild

매개변수 목록은 Sun Tzu용입니다. 세 가지 프로세스를 모두 수정할 수 있습니다. 할아버지 스크립트는 자체적으로 매개변수를 가져옵니다.

다음은 나머지 매개변수를 손자에게 전달하는 올바른 방법입니까?

#!/usr/bin/env bash
# This is the grandfather    
first_arg="$1"
shift 1;

export MY_ARGS="$@"

나중에 다음과 같이 손자 프로세스를 호출하는 명령의 일부로 하위 프로세스의 환경 변수를 "전파"합니다.

grandchild --foo "$MY_ARGS"  # append $MY_ARGS as arguments to foo

답변1

스크립트에서 배열을 문자열로 다운그레이드해서는 안 됩니다. 환경 변수와 해당 값은 간단한 key=value쌍이며, 여기서 keyvalue는 모두 문자열입니다. 연결을 통해 위치 매개변수를 간단한 문자열로 줄이면 이들을 별도로 유지하기 어렵고 결국 사용하려고 할 때 올바르게 참조하기가 어렵습니다.

대신 명령줄의 다음 스크립트에 전달하려는 위치 인수(명령줄 인수)를 전달하세요.

#!/bin/bash

first_arg=$1
shift

# later ...

./my_other_script "$@"

다른 스크립트에서는:

#!/bin/bash

# use "$@" here
foo --bar "$@"

답변2

편집: bash에서 배열을 내보낼 수 없는 것 같습니다. 배열이나 이와 유사한 것을 설정하는 함수를 내보내야 할 수도 있습니다.

배열을 사용해야 합니다. 그렇지 않으면 공백이 있는 인수가 여러 단어로 확장됩니다.

export MY_ARGS=("$@")


foo --bar "${MY_ARGS[@]}"

답변3

사람들이 왜 이 질문으로 인해 혼란스러워하는지 잘 모르겠지만 아마도 질문이 혼란스럽고 이것이 나에게 도움이 되는 것 같습니다.

my_args_array=("$@")
export MY_ARGS="${my_args_array[@]}"

그런 다음 MY_ARGS다음과 같이 사용합니다.

foo --bar $MY_ARGS

노트@Kusalananda가 지적했듯이: 이것은실패하다원래 매개변수에 공백이 있는 경우. 이 경우 $@하위 프로세스를 통해 매개변수를 전달하는 대신 환경 변수를 사용하는 것이 더 좋습니다 .

답변4

일반적인 대답은 이것이다. 다음을 사용하여 매개변수를 전달할 수 있습니다.

  • 명령줄 위치 매개변수
  • 환경 변수
  • 운영 체제에서 사용 가능한 모든 IPC(프로세스 간 통신)

처음 두 가지에만 집중하세요.

  • 위치 매개변수는 가장 자연스러운 방법입니다. 여기에는 "$@"현재 정의된 모든 위치 매개변수의 가능한 편집 및 추가 전송이 포함됩니다 . 이는 프로세스 계층 구조의 모든 단계에서 수행되어야 합니다.
  • 환경 변수는 키-값 쌍의 형태로 제공되기 때문에 위치 매개변수만큼 간단하지 않습니다. 이런 식으로 값을 전달하더라도 값을 얻으려면 키가 필요합니다. 그것이 유일한 환경 변수가 아닌 한, 충분한 고려 없이는 가정하지 않을 것입니다. 하지만 이 방법은 가능합니다. 당신이 해야 할 일은 이해 당사자들 간에 키를 공유하는 것뿐입니다. 키 자체는 패턴을 기반으로 할 수 있습니다. 이를 수행하는 방법에 대한 예는 다음과 같습니다.

    p.bash두 개의 스크립트 - 및 가 있습니다 c.bash. p부모를 대신하여, 그러나 c자녀를 대신하여. 중개자가 환경을 통해 전송된 값을 삭제하지 않는 한 중개자를 통해 분리될 수 있습니다. 단순화를 위해 두 스크립트는 p.bash호출에서 직접 연결됩니다 c.bash.

    이것은 p.bash:

    #!/bin/bash
    shift #consume the first argument
    #parse and export the other arguments
    prefix=abcdef_
    i=0
    for a in "$@"; do
        export "$prefix""$i"="$a"
        ((i++))
    done
    ./c.bash
    

    이것은 c.bash:

    #!/bin/bash
    #consume the env arguments
    prefix=abcdef_
    env | grep ^"$prefix"
    

    실행은 다음과 같습니다.

    $ ./p.bash arg "1 2" "3 4" "5 6"
    abcdef_0=1 2
    abcdef_1=3 4
    abcdef_2=5 6
    

    각 스크립트에 대해 하나씩 두 줄을 설명하겠습니다.

    첫 번째는 발전기입니다.

     export "$prefix""$i"="$a"
    

    exportabcdef_0등의 형태로 변수를 사용하여 환경을 채웁니다 abcdef_1. 이제 하위 프로세스는 해당 환경에서 이를 찾을 수 있습니다. (일부 중개인이 재설정하지 않는 한)

    env | grep ^"$prefix"아이들은 소비자입니다. env환경 변수를 나열하고 grep관련 전송을 담당하는 접두사와 관련되지 않은 줄을 필터링합니다. 여기서 무슨 일이 일어나고 있는지 이해하고 나면 전송된 변수에 액세스하여 하위 프로세스에서 사용할 수 있어야 합니다.

관련 정보