Перенаправить часть функции mapfile на стандартный вывод, но не в массив

Заменить каждый буквенный символ буквойN:

tr '[:alpha:]' N < file.txt > file2.txt
-1
13.05.2021, 12:50
1 ответ

mapfile считывает весь стандартный ввод в массив, поэтому вы не можете использовать стандартный вывод функции для отображения сообщений типа «Статус».

Попробуйте сделать так:

$ cat map.sh 
#!/bin/bash

exec 3>&1

SomeFunction(){
  printf "%s\n" {0..3}
  echo "Status" >&3
}

mapfile -t SomeArray < <(SomeFunction)

declare -p SomeArray

Пояснение:

  1. Во-первых, сценарий дублирует свой стандартный вывод в &3.

  2. Когда выполняется mapfile, он считывает стандартный ввод из стандартного вывода подстановки процесса.

    &3не затрагивается подстановкой процесса, поэтому он по-прежнему доступен в функции и по-прежнему ссылается на исходный стандартный вывод сценария (, например. ваш tty или куда-либо вывод сценария был перенаправлен на ), а не на перенаправление.

  3. SomeFunctionвыводит сообщение о состоянии в &3, а не в (перенаправленный )стандартный вывод.

Выход:

$./map.sh 
Status
declare -a SomeArray=([0]="0" [1]="1" [2]="2" [3]="3")

Кстати, если вы хотите сделать что-то более интересное с "&3", чем просто вывести его на стандартный вывод, вам нужно будет оператор execперенаправить его в файл или именованный канал. или что-то.

Попробуйте выполнить одно из следующих действий, например, и вы обнаружите, что не можете перенаправить &3. Слишком поздно, он уже ушел в исходный стандартный вывод сценария :

.
mapfile -t SomeArray < <(SomeFunction) > /dev/null

mapfile -t SomeArray < <(SomeFunction) 3> /dev/null
2
28.07.2021, 11:32

Теги

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