Gre*_*bet 3 tcsh command-substitution
所以,我写了一个简单的脚本来将sh
-styleexport key=value
语句转换为csh-style
setenv key value
for docker-machine env
。
#!/bin/sh
docker-machine env | sed -e 's/export/setenv/' -e 's/=/ /' -e '$d'
echo '# eval `docker-machine env`'
Run Code Online (Sandbox Code Playgroud)
它产生以下输出
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`
Run Code Online (Sandbox Code Playgroud)
在 my 中,.tcshrc
我已将此脚本绑定到 alias docker-machine-env-csh
。
我可以使用临时变量来获取这个脚本的输出就好了
% docker-machine-env-csh >! /tmp/csh && source /tmp/csh
Run Code Online (Sandbox Code Playgroud)
但是,我似乎无法直接eval
得到这个别名的结果
% eval `docker-machine-env-csh`
setenv: Too many arguments.
Run Code Online (Sandbox Code Playgroud)
或者以保留换行符的方式将其分配给变量。
% set a = `docker-machine-env-csh`
% printf "%s\n" "$a"
setenv ... setenv ... setenv ...
Run Code Online (Sandbox Code Playgroud)
虽然,奇怪的是printf "%s\n" `docker-machine-env-csh`
似乎在每个标记之间插入一个换行符。
% printf "%s\n" `docker-machine-env-csh`
setenv
...
...
setenv
...
...
Run Code Online (Sandbox Code Playgroud)
如何在tcsh
命令替换中保留换行符?
有很多很好的理由为什么建议不要使用csh
或不使用tcsh
脚本。那就是其中之一。
要将some command
逐字输出到 中的 shell 变量中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
Run Code Online (Sandbox Code Playgroud)
不要忘记使用$var:q
语法来扩展变量,如下所示:
printf '<%s>\n' $var:q
Run Code Online (Sandbox Code Playgroud)
POSIXsh
等价物将是:
var=$(some command; echo .)
var=${var%.}
Run Code Online (Sandbox Code Playgroud)
现在,如果您的docker-machine-env-csh
命令确实只在一行上输出信息,或者至少每一行都以 a 结尾;
并且没有注释,这样当与空格连接时它们仍然是有效的 csh 代码(如应用程序,例如dircolors
或ssh-agent
do 当他们想要他们的输出时要传递给csh
's eval
),那么你可以这样做:
set var = "`docker-machine-env-csh`"
printf '%s\n' "$var"
# or printf '%s\n' $var:q
# or printf '%s\n' "$var:q"
Run Code Online (Sandbox Code Playgroud)
使用set var = `docker-machine-env-csh`
,tcsh
在空白处拆分(并创建一个数组变量),而使用set var = "`docker-machine-env-csh`"
,它仅在换行符上拆分(仍然是一个数组变量,但如果输出只有一行,则该数组只有一个元素)。
在这里您可以使用"$var"
in place 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`"'
Run Code Online (Sandbox Code Playgroud)