Existem vários motivos pelos quais não é recomendado usar csh ou tcsh para o script. Esse é um desses.
Para obter a saída de some command verbatim em uma variável de shell em tcsh , você precisa de algo como:
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
Não se esqueça de usar a sintaxe $var:q para expandir a variável como em:
printf '<%s>\n' $var:q
O POSIX sh equivalente seria:
var=$(some command; echo .)
var=${var%.}
Agora, se o comando docker-machine-env-csh emitiu as informações apenas em uma linha, ou pelo menos com cada linha terminada com ; e sem comentários, para que, quando unidos a espaços, ainda sejam códigos csh válidos (como aplicativos como dircolors ou ssh-agent do quando eles querem que sua saída seja passada para csh ' eval ), então você poderia fazer:
set var = "'docker-machine-env-csh'"
printf '%s\n' "$var"
# or printf '%s\n' $var:q
# or printf '%s\n' "$var:q"
Com set var = 'docker-machine-env-csh' , tcsh divide em espaços em branco (e cria uma variável de matriz), enquanto com set var = "'docker-machine-env-csh'" , ele divide somente em nova linha (ainda uma variável de matriz, mas se a saída tiver apenas uma linha, essa matriz tem apenas um elemento).
Aqui você pode usar "$var" no lugar de $var:q porque $var não contém caracteres de nova linha. "$var" uniria os elementos da matriz com espaço enquanto $var:q os preservaria (aqui há apenas um elemento, portanto não faz diferença). Se esses elementos da matriz pudessem conter novas linhas e você quisesse se juntar a eles com espaço, você usaria "$var:q" .
Então, talvez você possa modificar seu script como:
#! /bin/sh -
docker-machine env | sed '
s/export/setenv/
s/=/ /
/^#/!s/$/;/
$d'
echo '# eval "'docker-machine env'"'