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

Я хотел бы выполнить команды внутри скрипта оболочки и сохранить в переменной, но он открывает новую оболочку, которую я не хочу. Есть ли способ исправить это? Вот мой сценарий.

#!/bin/bash V1=`<any_command>` #The shell should not open a new shell V2=`<another_command>` #The shell should not open a new shell 

Я могу выполнить сценарий оболочки, как показано ниже, для выполнения в той же оболочке:

 . ./Script.sh 

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

 V1=`<any_command>` 

Который все еще открывает новую оболочку, которой я не хочу.

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

Если вы сохраняете вывод команды в переменной, эта команда выполняется в подоболочке . Этого не избежать. Если вы хотите сохранить изменения в контексте оболочки (переменные, переадресации и т. Д.) И захватить вывод, вам придется организовать свой сценарий по-разному.

Один из способов – использовать временный файл. Это переносимо (работает в любой POSIX sh, за исключением того, что способ создания временного файла не является POSIX) и неинвазивный (вы можете обрабатывать any_command как черный ящик, вам не нужно его изменять).

 unset tmp1 trap 'rm -f "$tmp1"' EXIT INT TERM HUP tmp1="$(mktemp)" any_command >"$tmp1" V1=$(cat "$tmp1") rm "$tmp1" 

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

 f () { echo "$1" a=$((a+$1)) echo "$2" } V1=$(f 4 2) 

должно быть изменено на

 f_into_V1 () { V1="${V1}${1}" a=$((a+$1)) V1="${V1}${2}" } f_into_V1 4 2 
  • Как подсчитать конкретные строки в файле?
  • Распечатать заданное число в обратном порядке
  • Преобразование подчеркивания в PascalCase, т.е. UpperCamelCase
  • Конкатенация строковой переменной внутри цикла for в оболочке bash
  • Как запустить Firefox из сценария?
  • при чтении строки в сценарии оболочки - как остановить цикл?
  • Что делает exec $ SHELL -l?
  • как отправить целое число как параметр
  • Простой скрипт Bash; Только работает?
  • Как путь к исполняемому набору, если скрипт находится в PATH
  • как копировать файлы, такие как Microsoft Robocopy, в debian?
  • Linux и Unix - лучшая ОС в мире.