Как назначить вывод команды переменной без запуска команды в подоболочке?

Если у меня есть такая функция:

TEST() { if [[ "$1" == "hi" ]] then exit 1 fi echo "Some text" } 

и если я запустил функцию в текущей оболочке с помощью:

 TEST "hi" 

все работает так, как ожидалось. Оператор if в функции будет правдой, и весь скрипт завершится. Если я сделаю это, с другой стороны:

 FUNCTION_OUTPUT=$(TEST "hi") 

Чтобы я мог поймать stdout из функции в переменной, оператор if внутри функции будет по-прежнему прав, «exit 1» по-прежнему будет срабатывать, но поскольку мы работаем в подоболочке, скрипт будет продолжать работу.

Вместо использования VAR_NAME = $ () для запуска чего-либо в подоболочке и назначения его переменной, есть ли способ запустить ее в текущей оболочке, чтобы строка «exit 1» в моей функции фактически выходила из всего скрипта?

4 Solutions collect form web for “Как назначить вывод команды переменной без запуска команды в подоболочке?”

Назначение переменной – это просто простая команда , поэтому вы можете использовать условие if, чтобы проверить, не успешна ли неудача функции:

 if ! FUNCTION_OUTPUT=$(TEST hi); then echo Function return non-zero status exit 1 fi # This line never printed printf '%s\n' "$FUNCTION_OUTPUT" 

Если функция успеха, у вас будет переменная FUNCTION_OUTPUT с результатом функции:

 if ! FUNCTION_OUTPUT=$(TEST hii); then echo Function return non-zero status exit 1 fi # Output content of FUNCTION_OUTPUT printf '%s\n' "$FUNCTION_OUTPUT" 

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

Существует много способов выхода из сценария.

 VAR=$(FUNCTION) || kill -"$(($?&127))" 0 

… может быть в одном направлении. Он должен перейти к группе процессов родительской оболочки, независимо от того, возвращается ли она от FUNCTION . Это не совсем сглажено, но вы можете легко получить возврат из подстановки команд, если это то, о чем вы просите. Если вам нужны предложения о назначении переменной, ну, из текущей функции оболочки вы можете сделать это так:

 fn(){ var=x; }; fn; echo "$var" 

 x 

Если это должен быть выход какой-то команды, вы говорите о многоуровневой оценке. Вам действительно нужно доверять этому выводу, иначе вам нужно захватить весь поток, и в этом случае вам лучше быть уверенным, когда его ожидать. Такие вещи обычно выполняются с помощью труб – вот как работают подстановки команд – ну, это и подоболочки, конечно. Как и в случае с оболочкой, вы должны read данные, как и в других местах.

Мне нравится использовать мою собственную маленькую трубу – я пишу немного за раз в буфере трубы и читаю ее снова, когда я готов.

 fn(){ echo hey; read hey; } <> <(:) >&0 fn; echo "$hey" 

 hey 

… Наверное, я должен упомянуть, что если вы последуете этому последнему примеру, вы должны проявлять особую осторожность, чтобы не заполнить буфер. Только напишите немного за раз и прочитайте его, как только сможете. На практически любой системе вы можете рассчитывать на базовый 512-байтовый буфер, что мало, но они обычно больше.

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

Его материал, подобный тому, что затрудняет обмен сообщениями процессов, – это нужно тщательно контролировать, совершенную синхронизацию и отслеживать все отдельные темы задачи одновременно. Вот почему раковины развилки.

Я использую:

 tmp_fifo=$(mktemp) mkfifo ${tmp_fifo} exec 5<>${tmp_fifo} assign() { local var=$1; shift "$@" >&5 read ${var} <&5 } assign myVar echo hola echo $myVar rm -f ${tmp_fifo} 
  • отображение PID
  • Развертывание Jenkins не передается переменной java
  • Как использовать глобальные переменные массивы в псевдонимах или функциях
  • Присвоение нового значения непосредственно в индекс символа значения в массиве с zsh
  • Как сопоставить текст между строкой и пробелом
  • Создать переменную на основе порядка, в котором файл находится в алфавитном списке файлов
  • Shell: как использовать 2 переменные с условием
  • Отложить переменное расширение до подоболочки
  • Вставка переменных в команду в сценарии оболочки
  • Использование eval в файле make
  • Чтение переменных без bash из файла в скрипт bash
  • Linux и Unix - лучшая ОС в мире.