매개변수 목록과 세 가지 프로세스가 있습니다.
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
쌍이며, 여기서 key
및 value
는 모두 문자열입니다. 연결을 통해 위치 매개변수를 간단한 문자열로 줄이면 이들을 별도로 유지하기 어렵고 결국 사용하려고 할 때 올바르게 참조하기가 어렵습니다.
대신 명령줄의 다음 스크립트에 전달하려는 위치 인수(명령줄 인수)를 전달하세요.
#!/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"
export
abcdef_0
등의 형태로 변수를 사용하여 환경을 채웁니다abcdef_1
. 이제 하위 프로세스는 해당 환경에서 이를 찾을 수 있습니다. (일부 중개인이 재설정하지 않는 한)env | grep ^"$prefix"
아이들은 소비자입니다.env
환경 변수를 나열하고grep
관련 전송을 담당하는 접두사와 관련되지 않은 줄을 필터링합니다. 여기서 무슨 일이 일어나고 있는지 이해하고 나면 전송된 변수에 액세스하여 하위 프로세스에서 사용할 수 있어야 합니다.