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자 문자열 대신 test
5자 문자열을 설정합니다 . 이는 로 설정된 원래 예제를 모방합니다 . 그 이유는 두 경우 모두 쉘이 코드를 실행하고 인수를 사용하여 명령을 호출하고 있다고 판단하기 때문입니다 . 한 경우에는 명령이 첫 번째 인수를 갖는 외부 프로그램 이고 , 다른 경우에는 명령이 내장 프로그램입니다 .hello
hello world
zsh -c "export test=$(echo "hello world")"
test
hello
export test=hello world
zsh
-c
eval
test
로 설정 하려면 또는 또는 hello world
같은 입력을 얻기 위해 내부 쉘 평가를 준비해야 합니다 . 값의 임의 문자에 대해 작동하는 직접적인 방법은 없습니다. 문자열에 작은따옴표가 포함된 경우 작은 따옴표로 묶는 것은 실패합니다. 문자열에 다음 중 하나가 포함되어 있으면 실패합니다. 개행 문자로 작업하지 마십시오. 이 어려움을 해결하는 방법은 수행하려는 작업에 따라 다릅니다. 많은 답변은 다음에서 찾을 수 있습니다.export test="hello world"
export test='hello world'
export test=hello\ world
`"\[
인용하다이 사이트에 질문을 해보세요.
그러나 이것은 당신이 원하는 것이 아닐 수도 있습니다. 당신이 정말로 하고 싶은 것이 무엇인지 명확하지 않습니다. 코드는 동일한 쉘에 의해 실행됩니다. 이것이 source
OR의 전부입니다 eval
. 동일한 프로그램 내에서 코드를 실행하는 것입니다. shebang으로 시작하는 파일을 읽는 예를 보여주고 있지만 source
shebang 줄은 무시됩니다.문서실행되지 않음: 해당 내용만 실행됩니다.
다른 셸(예: bash)을 사용하여 변수 값을 구성하는 동안 하나의 프로그램(예: zsh)을 사용하려면 모든 것을 잊어버리고 다른 프로그램에서 값을 인쇄하도록 하세요. 간단한 방법은 다음과 같습니다.
test=$(zsh -c 'echo "hello world"')
명령 대체는 후행 줄 바꿈을 제거한다는 점에 유의하십시오. 따라서 값은 끝에 개행이 없는 test
11자 문자열이 됩니다 . 후행 줄 바꿈이 포함된 전체 출력을 hello world
얻으려면 echo
끝에 다른 문자(및 선택적 줄 바꿈)를 추가한 다음 제거하십시오.
test=$(zsh -c 'echo "hello world"'; echo .); test=${test%.}
답변2
명령으로 변수 정의를 작성한 다음 이를 사용하여 변수를 가져오는 것이 더 간단할 수 있습니다.프로세스 교체:
$ echo $test
$ . <(echo "test='hello world'")
$ echo "$test"
hello world