한 셸 스크립트에서 다른 셸 스크립트로 모든 변수를 전달하시겠습니까?
'/bash'라는 이름의 .test.sh
라이선스:
#!/bin/bash
TESTVARIABLE=hellohelloheloo
./test2.sh
★★★test2.sh
음음음같 뭇매하다
#!/bin/bash
echo ${TESTVARIABLE}
이것은 동작하지 않습니다.모든 변수를 매개 변수로 전달하고 싶지 않습니다. 오버킬이기 때문입니다.
다른 방법이 있나요?
기본적으로 다음 두 가지 옵션이 있습니다.
- 환경변수)로 합니다.
export TESTVARIABLE
를 참조해 주세요. - 두 번째 스크립트)의 소스를 합니다.
. test2.sh
같은 껍데기 안에서 작동하게 됩니다.이를 통해 어레이와 같은 보다 복잡한 변수를 쉽게 공유할 수 있을 뿐만 아니라 다른 스크립트가 소스 셸의 변수를 수정할 수도 있습니다.
갱신:
「」를 export
기존 변수를 사용하여 환경 변수를 설정할 수 있습니다.
A=10
# ...
export A
은 양쪽에 모두 가 있을 이다.bash
★★★★★★★★★★★★★★★★★」sh
bash
요.
export A=10
이것도 내 거랑 똑같아 sh
도)bash
, 을 사용하면 .echo $SHELL
체크할 수 있습니다. 그것이 반드시 하지 않습니다.sh
안전하게 행동하고 분리하는 게 최선이에요
이 방법으로 내보내는 변수는 실행하는 스크립트에 표시됩니다.다음은 예를 제시하겠습니다.
a.sh:
#!/bin/sh
MESSAGE="hello"
export MESSAGE
./b.sh
b.sh:
#!/bin/sh
echo "The message is: $MESSAGE"
그 후, 다음과 같이 입력합니다.
$ ./a.sh
The message is: hello
이 두 가지가 모두 셸 스크립트라는 사실도 부수적인 것일 뿐입니다.환경변수는 실행하는 모든 프로세스에 전달할 수 있습니다.예를 들어 python을 대신 사용한 경우 다음과 같이 나타납니다.
a.sh:
#!/bin/sh
MESSAGE="hello"
export MESSAGE
./b.py
b.py:
#!/usr/bin/python
import os
print 'The message is:', os.environ['MESSAGE']
소싱:
대신 다음과 같이 소스를 제공할 수 있습니다.
a.sh:
#!/bin/sh
MESSAGE="hello"
. ./b.sh
b.sh:
#!/bin/sh
echo "The message is: $MESSAGE"
그 후, 다음과 같이 입력합니다.
$ ./a.sh
The message is: hello
」의 을 「중요 있다.b.sh
같은 셸에서 직접 실행합니다.변수에 액세스하기 위해 변수를 내보낼 필요가 없습니다.이를 통해 보유하고 있는 모든 변수를 암묵적으로 공유할 수 있을 뿐만 아니라 다른 스크립트가 셸에서 변수를 추가/삭제/수정할 수 있습니다.물론 이 모델에서는 양쪽 스크립트가 같은 언어여야 합니다(sh
★★★★★★★★★★★★★★★★★」bash
메시지를 주고받는 예를 제시하겠습니다.
a.sh:
#!/bin/sh
MESSAGE="hello"
. ./b.sh
echo "[A] The message is: $MESSAGE"
b.sh:
#!/bin/sh
echo "[B] The message is: $MESSAGE"
MESSAGE="goodbye"
그 후, 다음과 같이 입력합니다.
$ ./a.sh
[B] The message is: hello
[A] The message is: goodbye
로 잘 .bash
또, 어레이나 어소시에이션 어레이 등, 환경 변수로서 표현할 수 없었던 보다 복잡한 데이터를 간단하게 공유할 수 있습니다.
치명적 오류는 간단한 가능성을 제시했습니다.두 번째 스크립트는 중요한 변수 중 일부를 변경할 수 있습니다.
( . ./test2.sh )
로 묶으면 에서는 변경 .test2.sh
네, 네, 네.
해야 할 또 다른 사용법입니다.★★★★set -a
.
-a
: 이 옵션이 켜져 있는 경우 할당이 실행되는 각 변수에 대해 내보내기 속성을 설정해야 합니다.IEEEE 규격 1003.1-2001, 섹션 4.21, 변수 할당의 기본 정의 볼륨을 참조하십시오.명령어 유틸리티 이름 앞에 할당이 있는 경우 내보내기 속성은 유틸리티가 완료된 후 현재 실행 환경에서 유지되지 않습니다.단, 특정 빌트인 유틸리티 중 하나 앞의 것이 빌트인 완료 후에도 내보내기 속성이 유지되는 것은 예외입니다.할당이 명령어 유틸리티 이름 앞에 없는 경우 또는 할당이 getopts 또는 read 유틸리티의 조작 결과인 경우 내보내기 속성은 변수가 설정 해제될 때까지 유지됩니다.
Bash 매뉴얼:
-a
: 명령어 및를 표시합니다 후속 명령어 환경으로 내보내기 위해 수정 또는 생성된 변수 및 함수를 표시합니다.
고객님의 경우:
set -a
TESTVARIABLE=hellohelloheloo
# ...
# Here put all the variables that will be marked for export
# and that will be available from within test2 (and all other commands).
# If test2 modifies the variables, the modifications will never be
# seen in the present script!
set +a
./test2.sh
# Here, even if test2 modifies TESTVARIABLE, you'll still have
# TESTVARIABLE=hellohelloheloo
되어 있는 은, 「」로 한정되어 있는 것에 해 주세요.set -a
변수는 내보내기로 되어 있습니다.즉, 다음과 같습니다.
set -a
a=b
set +a
a=c
bash -c 'echo "$a"'
c
도, 빈 줄도 .b
(마이너스)set +a
는 내보내기 표시를 해제하지 않으며 내보낸 환경에만 할당 값을 "저장"하지 않습니다.물론 이것은 가장 자연스러운 행동이다.
「」를 사용: 「 」set -a
/set +a
모든 변수를 수동으로 내보내는 것보다 덜 지루할 수 있습니다.두 번째 스크립트는 동일한 셸 언어로 작성된 스크립트뿐만 아니라 모든 명령어로 작동하므로 두 번째 스크립트를 소싱하는 것보다 우수합니다.
실제로 (적어도 수동으로 환경 변수를 전달해도 문제가 없다면) 내보내기 및 설정 해제 또는 소싱 작업을 다시 수행하는 것보다 더 쉬운 방법이 있습니다.
a.sh로 해 주세요.
#!/bin/bash
secret="winkle my tinkle"
echo Yo, lemme tell you \"$secret\", b.sh!
Message=$secret ./b.sh
및 b.sh 가 됩니다.
#!/bin/bash
echo I heard \"$Message\", yo
관찰된 출력은
[rob@Archie test] $/a.
b b.sh, "takle my tinkle", "takle my tinkle", "takle" b.sh!
윙크하는
은 마지막 .a.sh
서, snowledge.Message
「 」의 만../b.sh
、 [ ]의 으로 설정되어 있습니다.secret
부에서a.sh
. 기본적으로, 그것은 매개 변수/ 논쟁을 불러일으키고 있다.기본적으로 명명된 매개 변수/인수와 비슷합니다.하지만, 지 만, 상, 이 음, 은 수 과 있 more니, than that습효,다 though like works it변 for even하같가다도에과,,$DISPLAY
, X 서버 응용 프로그램을 제어합니다.응용 프로그램이 시작되는 X 서버를 제어합니다.
기억하세요, 환경 변수의 길이는 무한하지 않습니다.환경 변수 목록의 길이는 무한하지 않습니다.비교적 바닐라 커널을 사용하는 내 시스템에서는xargs --show-limits
에 인수 버퍼의 최대 사이즈가 2094486바이트임을 나타냅니다.이론적으로 데이터가 이보다 크면 셸 스크립트를 잘못 사용하는 것입니다(파이프, 누구 없나요?).
Bash에서는 다음과 같이 괄호를 사용하여 서브셸 내에서 변수를 내보내는 경우 내보낸 변수의 누설을 방지할 수 있습니다.
#!/bin/bash
TESTVARIABLE=hellohelloheloo
(
export TESTVARIABLE
source ./test2.sh
)
여기서의 장점은 명령줄에서 스크립트를 실행한 후 사용자 환경에 $TESTVARILE이 유출되지 않는다는 것입니다.
$ ./test.sh
hellohelloheloo
$ echo $TESTVARIABLE
#empty! no leak
$
Fatal Error(치명적 오류)라는 답변에 변수를 다른 셸 스크립트에 전달하는 방법이 하나 더 있습니다.
위에서 제시한 솔루션에는 몇 가지 단점이 있습니다.
using Export
이 경우 설계 이 아닙니다 변수가 범위를 벗어나게 되어 좋은 설계 프랙티스가 아닙니다.using Source
: 파일의 셸 할 수 있습니다 다른 파일을 발신한 다른 셸 스크립트파일의 사전 정의된 변수의 이름 충돌 또는 실수로 덮어쓰기가 발생할 수 있습니다.
우리가 사용할 수 있는 또 다른 간단한 해결책이 있습니다.당신이 올린 예를 보면,
test.sh
#!/bin/bash
TESTVARIABLE=hellohelloheloo
./test2.sh "$TESTVARIABLE"
test2.sh
#!/bin/bash
echo $1
산출량
hellohelloheloo
주의할 은 '이것'입니다.""
여러 단어 문자열을 전달할 때 필요합니다.를 더 들어 .
master.sh
#!/bin/bash
echo in master.sh
var1="hello world"
sh slave1.sh $var1
sh slave2.sh "$var1"
echo back to master
slave1.sh
#!/bin/bash
echo in slave1.sh
echo value :$1
slave2.sh
#!/bin/bash
echo in slave2.sh
echo value : $1
산출량
in master.sh
in slave1.sh
value :"hello
in slave2.sh
value :"hello world"
이는 이 링크에 적절하게 기술되어 있는 이유 때문에 발생합니다.
하나의 은 '보다 낫다'를 사용하는 입니다.eval
이것은 문자열을 신뢰할 수 있는 경우에만 적합합니다. 번째 수 .
echo "VAR=myvalue"
그 후, 다음과 같이 입력합니다.
eval $(./first.sh) ./second.sh
이 접근법은 환경변수를 설정하는두 번째 스크립트가 bash가 아닌 경우에도 특히 중요합니다.export
변수가 민감하고 지속되지 않도록 하기 때문일 수 있습니다.
또 다른 방법으로는 조금 더 쉬운 것은 명명된 파이프를 사용하는 것입니다.명명된 파이프를 통해 여러 프로세스 간에 메시지를 동기화하고 전송할 수 있습니다.
A.bash:
#!/bin/bash
msg="The Message"
echo $msg > A.pipe
B.bash:
#!/bin/bash
msg=`cat ./A.pipe`
echo "message from A : $msg"
사용방법:
$ mkfifo A.pipe #You have to create it once
$ ./A.bash & ./B.bash # you have to run your scripts at the same time
B.bash는 메시지를 기다리고 A.bash는 메시지를 보내자마자 작업을 계속합니다.
언급URL : https://stackoverflow.com/questions/9772036/pass-all-variables-from-one-shell-script-to-another
'programing' 카테고리의 다른 글
파이프 출력 및 캡처 종료 상태(Bash) (0) | 2023.04.08 |
---|---|
대상 시스템에서 백그라운드에서 명령을 실행하도록 ssh를 가져오는 중 (0) | 2023.04.08 |
Bash 스크립트를 사용하여 사용자 계정과 비밀번호를 자동으로 추가하는 방법은 무엇입니까? (0) | 2023.04.08 |
.Net 데이터 구조:Array List, List, HashTable, Dictionary, Sorted List, Sorted Dictionary -- 속도, 메모리, 사용 시기 (0) | 2023.04.08 |
".bat" 파일에서 명령줄 매개 변수를 확인하는 방법 (0) | 2023.04.08 |