Использование подоболочки для передачи параметров с пробелами

У меня есть оболочка с именем «name_value.sh», которую я хочу передать параметрам, сгенерированным в под-оболочке. Как я могу гарантировать, что команда, получающая параметры из резервных пространств подпрограммы?

ПРИМЕЧАНИЕ. Это очень упрощенный пример того, что я делаю. Пожалуйста, прочитайте полностью, прежде чем отвечать.

  • Bash: неоднозначное перенаправление
  • Я специально хочу удалить строку вывода grep из текстового файла
  • Есть ли способ сделать историю при нажатии в bash, разделяемом между оболочками?
  • Является ли синтаксис «$ {PS1-}» и чем он отличается от простого «$ PS1»?
  • Инициировать ассоциативный массив bash в Makefile
  • перебирать файлы и отправлять строки в качестве позиционных параметров в другой файл
  • Упрощенный пример:

    ./name_value.sh $(echo "no_spaces"; echo "with spaces") 

    Где name_value.sh выглядит так:

     #!/bin/bash echo "Name=$1" echo "Value=$2" 

    Желаемый результат:

     Name=no_spaces Value=with spaces 

    Это очень упрощенный пример. Моя настоящая суб-оболочка сложна, создает петли и выводит десятки пар имя / значение, которые все должны быть сгенерированы одновременно и переданы в имя_значение.sh одновременно. У меня также нет контроля над файлом оболочки, который я вызываю.

    Я пробовал эхом с кавычками и использовал printf с «% q». Я также подумал о том, чтобы перенести результаты подоболочки в массив сначала, но не может заставить это работать. Мне нужна родительская оболочка для интерпретации подклассов, как если бы текст был введен вместо подклассов.

  • Почему у bash по умолчанию не было некоторых команд, которые я использовал в истории, но у меня есть другие?
  • Как войти в систему как root из Bash и делать что-то
  • Идите вперед в истории аргументов bash
  • Перемещение против копирования
  • как обнаружить спящий режим / резюме ноутбука (закрыть крышку, открыть) в osx из сценария bash
  • .bash_history vs history command
  • 2 Solutions collect form web for “Использование подоболочки для передачи параметров с пробелами”

    Да. Установите переменную IFS (которая обычно содержит пробел, табуляцию, новую строку), чтобы быть только новой линией. Таким образом, пробелы и вкладки не будут использоваться для разделения слов. Это даст вам желаемый результат.

     IFS=$'\n' set -o noglob # disable the second effect of leaving that # $(...) unquoted. ./name_value.sh $(echo "no_spaces"; echo "with spaces") 

    Тем не менее, я бы сделал, чтобы скрипт читал из stdin.

     # name_value.sh IFS= read -r name IFS= read -r value echo "Name=$name" echo "Value=$value" 

    тогда

     ( echo no_spaces; echo with spaces ) | ./name_value.sh 

    Я думаю, что этот подход более надежный.

    Когда вы используете эту команду

     ./name_value.sh $(echo "no_spaces"; echo "with spaces") 

    Команда bash выполняет команды «sub-shells» в «$ ()» и возвращает строку вывода

    пример

    Команда ввода: ./name_value.sh $ (echo "no_spaces"; echo "с пробелами")

    Обработанная команда: ./name_value.sh no_spaces с пробелами

    Следующий шаг – выполнить скрипт bash с тремя аргументами

    Первый аргумент: no_space

    Второй аргумент: с

    Третий аргумент: пробелы


    Это то же самое, что вызов скрипта вручную с помощью команды

     ./name_value.sh no_spaces with spaces 

    Для решения проблемы вам нужно вставить цитаты вокруг вызова подкласса «$ ()»

    Ты нуждаешься в этом

     ./name_value.sh $(echo "no_spaces") "$(echo "with spaces")" 

    И вы обработали команду

     ./name_value.sh no_spaces "with spaces" 

    И, наконец, вы выведете это будет

     Name=no_spaces Value=with spaces 
    Linux и Unix - лучшая ОС в мире.