환경 변수 내보내기

환경 변수 내보내기

값에 변수가 포함된 환경 변수를 내보내고 싶지만 내보내기 중에 변수(값 내에 있음)가 평가되는 것을 원하지 않습니다. 즉

export STY=for i in {0..3}; do echo $i; done

따라서 내 요구 사항은 STY를 에코할 때 필요한 출력이 다음과 같아야 한다는 것입니다.

echo $STY
for i in {0..3}; do echo $i; done 

그러나 $i는 내보내는 동안 평가됩니다. 나는 그대로 있어야합니다.

답변1

당신이 원하는 것이 있다면설명하다당신은 그것을 요청했습니다:

export STY="for i in {0..3}; do echo \$i; done"

당신이 정말로 의미하는 바를 원한다면 :

function STY() {
    for i in {0..3}; do echo $i; done
}
export -f STY

답변2

즉, eval "$hello"를 사용하십시오.

(이 답변은 원래 다음과 같이 말했습니다. eval $hello를 사용했지만 다른 포스터에서는 eval "$hello"가 더 안전하다고 지적했습니다.)

다음과 같이:

bash-2.05a$ export hello='for i in 0 1 2 3; do echo $i; done'

단순히 줄 시작 부분에 $hello라고 말하면 작동하지 않습니다. for 루프는 $variable 확장 전에 처리되기 때문입니다(단계 지향 언어는 싫어합니다).

bash-2.05a$ $hello
bash: for: command not found

그러나 평가는 작동합니다.

bash-2.05a$ eval $hello
0
1
2
3
bash-2.05a$ 

당신이 잘못한 것(혹은 잘못했을 수도 있는 것):

bash-2.05a$ export hello='for i in {0..4}; do echo $i; done'
bash-2.05a$ $hello
bash: for: command not found
bash-2.05a$ eval $hello
{0..4}
bash-2.05a$ for i in {0..4}; do echo $i; done
{0..4}
bash-2.05a$ 

즉, 적어도 제가 사용하고 있는 bash 버전에서는 {0..4}가 여러분이 생각하는 대로 작동하지 않습니다.

http://www.cyberciti.biz/faq/bash-for-loop/{0..4} 기능이 bash 3.0 이상에 나타난다고 가정해 보겠습니다.

어쩌면 당신도 나처럼(집이 아닌 woprk에서) 오래된 버전의 bash를 사용하고 있을까요?

답변3

$hello예상대로 작동하지 않는 이유:

  • 확장은 토큰으로 분할한 후 명령줄에서 수행됩니다.
  • for...do...doneCompound Command토큰화 단계에서 결정 됩니다 .
  • for명령이 아닙니다.

따라서 다음과 같은 작업을 수행할 수 없습니다.

$ "for" i in {0..4}; do echo $i; done
sh.exe": syntax error near unexpected token `do'

Bash가 명령줄을 토큰으로 분할하면 "for"not 이 표시되므로 for토큰은 do예상치 못한 것입니다.


귀하의 경우:

$ hello='for i in {0..4}; do echo $i; done'
$ $hello
sh.exe": for: command not found

Bash는 token 을 찾고 $hello&& variable-expansionword-spliting순서대로 발생합니다.
실제로 bash는 결과를 다음과 같이 구문 분석합니다 Simple Command.

  • command( for)는 나머지를 args( i, in, {0..4}, ;, do, ...) 로 사용합니다.
  • for, do, 등 ;done특별한 의미를 잃었습니다.

자세한 내용을 읽어보세요

답변4

문제에는 두 가지 측면이 있습니다.

  • 복잡한 표현식을 변수에 저장
  • 저장된 표현식 실행

표현식을 저장하려면 이스케이프 시퀀스와 특수 인용이 필요할 수 있습니다(귀하의 예에서는 이것이 사실인 것 같습니다). 실행은 두 가지 방법으로 발생할 수 있습니다.

  • Borealid의 답변과 같은 함수 호출: data=`STY()` - 함수의 표준 출력은 변수에 저장됩니다.
  • 표현식 평가: 데이터= eval $STY예제에 제공된 변수 정의

관련 정보