sh
だから-styleステートメントをforexport key=value
に変換する簡単なスクリプトを書いた。csh-style
setenv key value
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
蓄積的な出力をシェル変数に入れるには、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
コマンドが実際に1行にのみ情報を出力する場合、または少なくとも各行がコメントなしでa;
で終わっている場合は、スペースで連結しても有効なcshコードです(たとえば、アプリケーションに似ているか、必要に応じてdircolors
sssh-agent
に渡されたときに実行されます)。出力されるように)次のことができます。csh
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`"
改行でのみ分割されます(まだ配列変数ですが、出力に1行しかない場合、配列には1つの要素のみが含まれます)。
ここには改行文字が含まれていないため、"$var"
代わりに of を使用できます。配列要素を空白で連結しながら保持します(ここには要素が1つしかないので違いはありません)。これらの配列要素に改行文字が含まれていて、それらを空白に結合したい場合に使用できます。$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`"'