Есть много веских причин, по которым не рекомендуется использовать csh
или tcsh
для написания сценариев. Вот одна из них.
Чтобы получить вывод некоторой команды
дословно в переменную 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
Эквивалент POSIX sh
:
var=$(some command; echo .)
var=${var%.}
Теперь, если бы ваша команда docker-machine-env-csh
выводила информацию только в одну строку или хотя бы каждую строку завершала символом ;
и без комментариев, чтобы при соединении пробелами они все еще были корректным кодом csh (как это делают такие приложения, как dircolors
или ssh-agent
, когда хотят передать свой вывод в 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"
вместо $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`"'