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이 스크립트를 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에 전달될 때 수행). 출력되도록 ) 다음을 수행할 수 있습니다.csheval

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

관련 정보