Значение переменной не сохраняется при передаче в другую программу - PullRequest
1 голос
/ 20 февраля 2020

У меня есть функция с именем directory_chooser, и она содержит код для обновления переменной serial в ней несколько раз. Теперь это обычно работает нормально, но теперь я передаю всю эту функцию в column, и значение, обновленное функцией directory_chooser, не сохраняется.

Вот строка кода, где возникает проблема :

directory_chooser $1 | column -t -s $'\t'

Если я не перенесу функцию на column, код работает отлично. Однако передача в столбец приводит к тому, что значение serial, обновленное directory_chooser, не сохраняется. Я полагаю, это потому, что все конвейерные команды выполняются в подоболочке?

Поскольку мне нужно использовать значение serial позже в сценарии, для меня важно, чтобы значение serial сохраняется после того, как функция directory_chooser увеличивает его.

Какой может быть обходной путь для этого? Если вы хотите посмотреть весь код, вы можете посмотреть его здесь . Я не смог найти никакого решения, которое бы подходило к моей ситуации. Придется ли мне переписывать весь сценарий?

Первоначально я пытался записать весь вывод directory_chooser в файл, а затем перенаправить весь файл в column, чтобы добиться того же самого, и все работало хорошо, но я хочу более элегантное решение. Кроме того, запись в файл при каждом запуске скрипта приводит к тому, что он становится намного медленнее, чем если бы я мог просто перенаправить всю функцию в column.

Вот рабочая версия скрипта где я писал в файл. Вы также можете прочитать другое, более короткое объяснение проблемы здесь .

1 Ответ

1 голос
/ 20 февраля 2020

Ваше предположение верно. Подоболочки порождения каналов и переменные, измененные в подоболочке, не изменяют родительские переменные.

Вы можете переключить канал на замену процесса , который будет запускаться column в дочернем процессе, но оставить directory_chooser в родительском.

directory_chooser "$1" > >(column -t -s $'\t')
...