tcsh는 명령 대체 `...`에서 줄바꿈을 유지합니다.

tcsh는 명령 대체 `...`에서 줄바꿈을 유지합니다.

그래서 sh-style 문을 for export key=value로 변환하는 간단한 스크립트를 작성했습니다 .csh-style setenv key valuedocker-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 코드가 되도록 하는 경우(예: 또는 출력을 원할 때 수행하는 ;응용 프로그램과 같습니다) ) 에 전달하려면 다음을 수행할 수 있습니다.dircolorsssh-agentcsheval

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`"'

관련 정보