因此,我編寫了一個簡單的腳本將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`'
它產生以下輸出
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
逐字輸出放入 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
不要忘記使用$var:q
語法來擴展變量,如下所示:
printf '<%s>\n' $var:q
POSIXsh
等效項是:
var=$(some command; echo .)
var=${var%.}
現在,如果您的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"
使用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`"'