tcshはコマンド置換 `...`で改行を維持します。

tcshはコマンド置換 `...`で改行を維持します。

shだから-styleステートメントをforexport 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コマンドが実際に1行にのみ情報を出力する場合、または少なくとも各行がコメントなしでa;で終わっている場合は、スペースで連結しても有効なcshコードです(たとえば、アプリケーションに似ているか、必要に応じてdircolorssssh-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`"改行でのみ分割されます(まだ配列変数ですが、出力に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`"'

おすすめ記事