그래서 sh
-style 문을 for export key=value
로 변환하는 간단한 스크립트를 작성했습니다 .csh-style
setenv key value
docker-machine env
#!/bin/sh
docker-machine env | sed -e 's/export/setenv/' -e 's/=/ /' -e '$d'
echo '# eval `docker-machine env`'
그리고 다음과 같은 출력을 생성합니다
setenv DOCKER_TLS_VERIFY "1"
setenv DOCKER_HOST "tcp://<ipv4 address>:<port>"
setenv DOCKER_CERT_PATH "<HOME>/.docker/machine/machines/default"
setenv DOCKER_MACHINE_NAME "default"
# Run this command to configure your shell:
# eval `docker-machine env`
내에서는 .tcshrc
이 스크립트를 별칭에 바인딩했습니다 docker-machine-env-csh
.
임시 변수를 사용하여 이 스크립트의 출력을 가져올 수 있습니다.
% docker-machine-env-csh >! /tmp/csh && source /tmp/csh
eval
하지만 이 별칭의 결과를 직접적으로 확인할 수는 없는 것 같습니다.
% eval `docker-machine-env-csh`
setenv: Too many arguments.
또는 줄 바꿈을 유지하는 방식으로 변수에 할당하십시오.
% set a = `docker-machine-env-csh`
% printf "%s\n" "$a"
setenv ... setenv ... setenv ...
하지만 이상하게도 printf "%s\n" `docker-machine-env-csh`
모든 토큰 사이에 개행 문자를 삽입하는 것 같습니다.
% printf "%s\n" `docker-machine-env-csh`
setenv
...
...
setenv
...
...
tcsh
명령 대체 에서 개행 문자를 어떻게 유지합니까 ?
답변1
csh
스크립팅 이나 사용을 권장하지 않는 데에는 많은 이유가 있습니다 tcsh
. 그게 그 중 하나입니다.
축어적 출력을 의 some command
쉘 변수로 가져오려면 tcsh
다음과 같은 것이 필요합니다.
set temp = "`(some command; echo .) | paste -d . - /dev/null`"
set var = ""
set nl = '\
'
foreach i ($temp:q)
set var = $var:q$i:r:q$nl:q
end
set var = $var:r:q
$var:q
다음과 같이 구문을 사용하여 변수를 확장하는 것을 잊지 마십시오 .
printf '<%s>\n' $var:q
POSIX에 sh
해당하는 내용은 다음과 같습니다.
var=$(some command; echo .)
var=${var%.}
이제 docker-machine-env-csh
명령이 한 줄에만 정보를 출력했거나 적어도 각 줄이 주석 없이 끝나서 공백과 결합해도 여전히 유효한 csh 코드가 되도록 하는 경우(예: 또는 출력을 원할 때 수행하는 ;
응용 프로그램과 같습니다) ) 에 전달하려면 다음을 수행할 수 있습니다.dircolors
ssh-agent
csh
eval
set var = "`docker-machine-env-csh`"
printf '%s\n' "$var"
# or printf '%s\n' $var:q
# or printf '%s\n' "$var:q"
를 사용하면 set var = `docker-machine-env-csh`
공백 tcsh
으로 분할하고 배열 변수를 생성하는 반면 를 사용하면 set var = "`docker-machine-env-csh`"
개행에서만 분할합니다(여전히 배열 변수이지만 출력에 한 줄만 있는 경우 해당 배열에는 하나의 요소만 포함됩니다).
여기서는 개행 문자를 포함하지 않기 때문에 "$var"
대신 사용할 수 있습니다 . 배열 요소를 공백과 결합하는 동시에 보존합니다(여기에는 요소가 하나만 있으므로 차이가 없습니다). 해당 배열 요소에 개행 문자가 포함될 수 있고 이를 공백으로 결합하려는 경우 를 사용합니다 .$var:q
$var
"$var"
$var:q
"$var:q"
따라서 다음과 같이 스크립트를 수정할 수 있습니다.
#! /bin/sh -
docker-machine env | sed '
s/export/setenv/
s/=/ /
/^#/!s/$/;/
$d'
echo '# eval "`docker-machine env`"'