Команда ниже будет работать отлично, я тестировал ее для своих нужд, потребуется только изменение содержимого.
rsync -acvzh source/ destination/
Есть хак, но я думаю, что он имеет смысл, если он вам нужен в цикле.
вы можете открыть cat
coproc
следующим образом: coproc CAT {cat; }
Это запустит команду cat
в фоновом режиме и установит две переменные среды: CAT_PID
и CAT
. Переменная CAT
представляет собой массив с STDOUT
и STDIN
(в этом порядке) файловым дескриптором (каналами), используемым cat
.
Таким образом, вы можете выполнить что угодно, записав вывод в и $ {CAT [1]}
, который представляет STDIN
, и использовать встроенную команду read
чтобы установить чтение переменной из $ {CAT [0]}
, то есть STDOUT
cat.
Вот пример:
coproc CAT { cat; }
echo 123 >&${CAT[1]}
read myvar <&${CAT[0]}
Для проверки:
echo $myvar
123
Не забудьте остановить кошку после того, как ее использовали. Вы можете сделать это, убив процесс.
kill $CAT_PID
Это имеет большое значение в настройке производительности.
С bash вы также можете сделать это так:
read a < <(echo hello)
echo "$a"
Или вот так:
shopt -s lastpipe
echo hello | read a
shopt -u lastpipe
echo "$a"
Но вам все равно нужно запустить подпроцесс, который будет запускать ruby, поэтому я не совсем понимаю, чего вы пытаетесь избежать ...
Если в Linux, с bash
вы могли бы сделать:
{
chmod u+w /dev/fd/3 # only needed in bash 5+
rbenv local > /dev/fd/3
IFS= read -rd '' -u 3 variable
} 3<<< ''
Это использует временный файл, как и каждый здесь-документ или здесь-строка, хотя это скрыто от вас .
Если rbenv
выводит меньше данных, чем может поместиться в канал без блокировки (обычно 64 КБ), все еще в Linux и только Linux, вы можете использовать канал вместо временного файла с:
{
chmod u+w /dev/fd/3 # only needed in bash 5+
rbenv local > /dev/fd/3
IFS= read -rd '' -u 3 variable
} 3< <(:)
С ksh93
или последние версии mksh
, используйте форму подстановки команд, которая не запускает подоболочку:
variable=${
rbenv local
}
Помните, что это противоречит IFS= read -rd ' '
, который удаляет конечные символы новой строки в выводе (как и все подстановки команд).