inner.sh
может быть:
printf '%s\n' "$1" >&3
и в outer.sh
вы можете сделать:
{ inner=$(middle "$@" 3>&1 >&4 4>&-); } 4>&1
printf '%s\n' "$inner"
Внутренний текст передается по каналу (в подстановке команд )и сохраняется в переменной оболочки. Это предполагает, что middle
не закрывает этот fd 3 перед вызовомinner.sh
(, но нет причин для этого ).
Пояснение:
{... } 4>&1
. В этой группе команд изначально оба fd 1 и 4 указывают на исходный стандартный вывод. IOW, мы сделали копию stdout external.sh на fd 4, чтобы иметь возможность восстановить его внутри подстановки команды $(...)
. Внутри этой подстановки команд stdout (fd 1 )представляет собой канал. В этом смысл замены команды. Он хочет получить вывод команды. Но здесь нам не нужен стандартный вывод middle
, нам нужно то, что он (или, точнее, его дочерний элементinner.sh
)записывает в fd 3, поэтому:middle 3>&1 >&4 4>&-
:для middle
мы делаем fd 3 каналом cmdsubst, чтобы то, что inner.sh
пишет там, попадало в $inner
, и мы восстанавливаем стандартный вывод middle
на сохраненный исходный стандартный вывод. на fd 4. Мы закрываем fd 4 после того, как он выполнил свою задачу, так как middle
не нужно ничего с ним делать. Я нашел решение своей проблемы:
Диск и раздел, на котором была установлена моя Arch Linux, были переименованы с nvme0 **на nvme1 **после установки дополнительного диска nvme на мой компьютер. Я исправил свою проблему, просто напрямую отредактировав файл fstab, расположенный в /etc, с помощью nano и вручную изменив 0 --> 1, чтобы последовательность загрузки действительно искала правильное расположение для моих разделов root, /home и SWAP.
Надеюсь, это поможет кому-нибудь, кто когда-нибудь столкнется с этой странной проблемой!