Захват вывода функции оболочки без подоболочки

Команда ниже будет работать отлично, я тестировал ее для своих нужд, потребуется только изменение содержимого.

rsync -acvzh source/ destination/
7
04.01.2017, 01:30
3 ответа

Есть хак, но я думаю, что он имеет смысл, если он вам нужен в цикле.

вы можете открыть 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

Это имеет большое значение в настройке производительности.

11
27.01.2020, 20:17

С bash вы также можете сделать это так:

read a < <(echo hello)
echo "$a"

Или вот так:

shopt -s lastpipe
echo hello | read a
shopt -u lastpipe
echo "$a"

Но вам все равно нужно запустить подпроцесс, который будет запускать ruby, поэтому я не совсем понимаю, чего вы пытаетесь избежать ...

3
27.01.2020, 20:17

Если в 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 ' ', который удаляет конечные символы новой строки в выводе (как и все подстановки команд).

3
27.01.2020, 20:17

Теги

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