환경 변수를 설정하는 쉘 스크립트


82

변수를 내보내는 쉘 스크립트를 작성하고 싶습니다.

아래에 스크립트를 나열했습니다.

echo "Perform Operation in su mode"
export ARCH=arm
echo "Export ARCH=arm Executed"
export PATH='/home/linux/Practise/linux-devkit/bin/:$PATH';
echo "Export path done"
export CROSS_COMPILE='/home/linux/Practise/linux-devkit/bin/arm-arago-linux-gnueabi-';
echo "Export CROSS_COMPILE done"

그러나 이것은 제대로 작동하지 않는 것 같습니다. 대신 쉘 프롬프트에서 개별적으로 명령을 실행해야합니다.


당신이 (예를 들어 bash는, KSH, SH)를 사용하는 쉘 어느



답변:


48

스크립트의 더 많은 부분을 보여 주시고 개별적으로 실행해야하는 명령과 간단하게 원하는 명령을 알려주십시오.

한편 변수를 확장하려면 작은 따옴표가 아닌 큰 따옴표를 사용해야합니다.

export PATH="/home/linux/Practise/linux-devkit/bin/:$PATH"

단일 명령 끝에있는 세미콜론도 필요하지 않습니다.

지금까지:

#!/bin/sh
echo "Perform Operation in su mode"
export ARCH=arm
echo "Export ARCH=arm Executed"
export PATH="/home/linux/Practise/linux-devkit/bin/:$PATH"
echo "Export path done"
export CROSS_COMPILE='/home/linux/Practise/linux-devkit/bin/arm-arago-linux-gnueabi-' ## What's next to -?
echo "Export CROSS_COMPILE done"
# continue your compilation commands here
...

다음 su과 같이 실행할 수 있습니다.

su -c 'sh /path/to/script.sh'

참고 : OP는 셸 스크립트를 사용하여 대화 형 셸에서 내보내기 변수를 만드는 방법에 대한 단계를 명시 적으로 요청하지 않았습니다. 그는 자신의 대본을 최대한 평가하도록 요청했습니다. 그는 그의 대본이 어떻게 사용될 것인지에 대한 세부 사항을 언급하지 않았습니다. 대화식 쉘 을 사용 .하거나 사용할 수 있습니다 source. 독립형 scipt 일 수도 있고 source다른 스크립트에서 가져온 것일 수도 있습니다 . 환경 변수는 대화 형 셸에만 국한되지 않습니다. 이 대답은 그의 문제를 해결했습니다.


1
안녕 konsolebox !! 대단히 감사합니다. 그러나 나는 큰 따옴표로 묶인 .. export PATH = "/ home / linux / Practise / linux-devkit / bin / : $ PATH"의 차이점을 이해하지 못했습니다. & export CROSS_COMPILE = '/ home / linux / Practise / linux-devkit / bin / arm-arago-linux-gnueabi-'를 작은 따옴표로 묶습니다. u에 의해 수정 된 스크립트가 잘 작동합니다.
Prag Rao

@PragRao Paramater 확장은 작은 따옴표로만 발생하지 않습니다. 여기에서 인용에 대한 자세한 내용을 설명 할 수 있습니다 .
konsolebox

3
@konsolebox 질문 이름은 "환경 변수를 설정하는 쉘 스크립트"처럼 들립니다. 커뮤니티의 대부분은 현재 쉘 ( source또는 .) 에서 이러한 종류의 스크립트를 실행하는 문제를 해결하기 위해이 질문을 발견했습니다 . OP의 질문에 정확히 대답 해 주셔서 감사하지만 Google 에서이 주제를 찾았으며 다음 답변이 귀하보다 더 많은 도움이되었습니다. 두 번째 답변에 대한 찬성 source.
투표 (

@avtomaton 다시 말하지만, Google에서 그것을 찾는 다른 사람들에 관한 것이 아닙니다. 질문의 원래 접근 방식에 관한 것입니다. 질문을 어떻게 변경해야하는지 또는 답변을 어떻게 제시해야하는지에 대한 우려가있는 경우 메타에서 토론하는 것을 고려하십시오.
konsolebox

226

source또는 약어 로 스크립트를 실행해야합니다..

source ./myscript.sh

또는

. ./myscript.sh

이는 기존 셸 내에서 실행되어 스크립트가 생성하거나 수정 한 모든 변수를 스크립트가 완료된 후 사용할 수 있도록합니다.

파일 이름 만 사용하여 스크립트를 실행하면 별도의 하위 셸에서 스크립트가 실행됩니다.


2
소스를 사용하여 ./setenv.sh-: 소스를 찾을 수 없음 오류를 제공합니다. 그리고. ./setenv.sh는 setenv.sh를 열 수 없습니다. 제발 도와 주 시겠어요? 감사합니다
Vishal

1
한 시간 동안 내 머리를 긁적이며 왜 그 망할 수출 변수가 거기에 (zsh) 시도 typeset -gx, 수출 등을 시도하지 않았고 내 wtf를 가지고 있었습니까? 순간 아직-하위 쉘이 자체 범위로 실행된다는 것을 몰랐습니다. 임박한 분노 관리 실수로부터 하루를 구 해주셔서 감사합니다
Inoperable

1

스크립트를 source =로 실행하여 디버그 모드에서도 실행하십시오.

source= ./myscript.sh

0

나는 그것을 해결할 수 없다 source ./myscript.sh. 소스를 찾을 수 없음 오류가 표시됩니다.
을 (를) 사용하는 경우에도 실패했습니다 . ./myscript.sh. myscript.sh를 열 수 없습니다.

그래서 내 옵션은 다음 스크립트에서 호출 할 텍스트 파일에 넣는 것입니다.

#!/bin/sh
echo "Perform Operation in su mode"
echo "ARCH=arm" >> environment.txt
echo "Export ARCH=arm Executed"
export PATH="/home/linux/Practise/linux-devkit/bin/:$PATH"
echo "Export path done"
export "CROSS_COMPILE='/home/linux/Practise/linux-devkit/bin/arm-arago-linux-gnueabi-' ## What's next to -?" >> environment.txt
echo "Export CROSS_COMPILE done"
# continue your compilation commands here
...

Tnen은 필요할 때마다 호출합니다.

while read -r line; do
    line=$(sed -e 's/[[:space:]]*$//' <<<${line})
    var=`echo $line | cut -d '=' -f1`; test=$(echo $var)
    if [ -z "$(test)" ];then eval export "$line";fi
done <environment.txt

1
필요할 때마다 while 루프 대신 소스 (export 문 사용) myscript.sh라는 파일을 생성하도록 수정할 수 있습니다. environment.shenvironment.sh
slajma
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.