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
이 스크립트를 alias 에 바인딩했습니다 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
명령이 실제로 한 줄에만 정보를 출력하거나 최소한 각 줄이 주석 ;
없이 a로 끝나는 경우 공백으로 연결해도 여전히 유효한 csh 코드입니다(예를 들어 응용 프로그램과 유사 dircolors
하거나 원할 때 s 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"
대신 of를 사용할 수 있습니다 . 배열 요소를 공백으로 연결하면서 유지합니다(여기에는 요소가 하나만 있으므로 차이가 없습니다). 이러한 배열 요소에 개행 문자가 포함되어 있고 이를 공백으로 결합하려는 경우 를 사용할 수 있습니다 .$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`"'