파일 대신 쉘 코드를 어떻게 얻을 수 있나요?

파일 대신 쉘 코드를 어떻게 얻을 수 있나요?

source명령에 대한 설명이 있습니다 .

source현재 쉘에서 인수로 전달된 파일의 내용을 실행하는 bash 쉘 내장 명령입니다. 동의어 .(마침표)가 있습니다.

예를 들어 실험을 위해 제 경우에는 다른 셸에서 변수를 내보내고 싶습니다 zsh( 에서 명령 실행 bash).

$ zsh -c "export test=$(echo "hello world")"
$ echo $test

$

zsh명령이 .dll 파일에서 직접 실행되지 않고 하위 쉘에서 실행되기 때문에 작동하지 않습니다 bash.

이런 식으로 스크립트를 만들고 가져오면:

#!/home/linuxbrew/.linuxbrew/bin/zsh

export test=$(echo "hello world")
$ chmod 777 test.zsh
$ source test.zsh
$ echo $test
hello world

잘 작동합니다.

문제는 파일을 통해서만 명령을 실행할 수 있기 source때문에 스크립트를 사용하지 않고 명령을 실행하는 방법입니다. source나는 다음과 같은 것을 달성하고 싶습니다 :

source zsh -c "export test=$(echo "hello world")"

이것이 불가능하다면 그 이유를 설명해 주십시오.

답변1

귀하의 질문에 대한 답변은 다음과 같습니다.eval.

eval "export test=$(echo "hello world")"

매개변수는 eval쉘 코드의 일부로 실행됩니다. 제대로 하기가 어려운 경우가 많습니다. 예를 들어 위의 코드는 11자 문자열 대신 test5자 문자열을 설정합니다 . 이는 로 설정된 원래 예제를 모방합니다 . 그 이유는 두 경우 모두 쉘이 코드를 실행하고 인수를 사용하여 명령을 호출하고 있다고 판단하기 때문입니다 . 한 경우에는 명령이 첫 번째 인수를 갖는 외부 프로그램 이고 , 다른 경우에는 명령이 내장 프로그램입니다 .hellohello worldzsh -c "export test=$(echo "hello world")"testhelloexport test=hello worldzsh-ceval

test로 설정 하려면 또는 또는 hello world같은 입력을 얻기 위해 내부 쉘 평가를 준비해야 합니다 . 값의 임의 문자에 대해 작동하는 직접적인 방법은 없습니다. 문자열에 작은따옴표가 포함된 경우 작은 따옴표로 묶는 것은 실패합니다. 문자열에 다음 중 하나가 포함되어 있으면 실패합니다. 개행 문자로 작업하지 마십시오. 이 어려움을 해결하는 방법은 수행하려는 작업에 따라 다릅니다. 많은 답변은 다음에서 찾을 수 있습니다.export test="hello world"export test='hello world'export test=hello\ world`"\[이 사이트에 질문을 해보세요.

그러나 이것은 당신이 원하는 것이 아닐 수도 있습니다. 당신이 정말로 하고 싶은 것이 무엇인지 명확하지 않습니다. 코드는 동일한 쉘에 의해 실행됩니다. 이것이 sourceOR의 전부입니다 eval. 동일한 프로그램 내에서 코드를 실행하는 것입니다. shebang으로 시작하는 파일을 읽는 예를 보여주고 있지만 sourceshebang 줄은 무시됩니다.문서실행되지 않음: 해당 내용만 실행됩니다.

다른 셸(예: bash)을 사용하여 변수 값을 구성하는 동안 하나의 프로그램(예: zsh)을 사용하려면 모든 것을 잊어버리고 다른 프로그램에서 값을 인쇄하도록 하세요. 간단한 방법은 다음과 같습니다.

test=$(zsh -c 'echo "hello world"')

명령 대체는 후행 줄 바꿈을 제거한다는 점에 유의하십시오. 따라서 값은 끝에 개행이 없는 test11자 문자열이 됩니다 . 후행 줄 바꿈이 포함된 전체 출력을 hello world얻으려면 echo끝에 다른 문자(및 선택적 줄 바꿈)를 추가한 다음 제거하십시오.

test=$(zsh -c 'echo "hello world"'; echo .); test=${test%.}

답변2

명령으로 변수 정의를 작성한 다음 이를 사용하여 변수를 가져오는 것이 더 간단할 수 있습니다.프로세스 교체:

$ echo $test

$ . <(echo "test='hello world'")
$ echo "$test"
hello world

관련 정보