Использование MPV для воспроизведения DVD-фильмов

Есть много веских причин, по которым не рекомендуется использовать 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`"'
3
13.04.2017, 15:36
0 ответов

Теги

Похожие вопросы