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

Я использую следующий метод для передачи команд в подоболочку, которая запускается «newgrp».

#!/bin/csh echo "Before newgrp" /usr/bin/newgrp users <<EONG echo "hello from within newgrp" id EONG echo "After newgrp" 

Он отлично работает, пока я не пытаюсь «установить» что-либо в подоболочке.

т.е.

 #!/bin/csh echo "Before newgrp" /usr/bin/newgrp users <<EONG echo "hello from within newgrp" set a=npy echo $a id EONG echo "After newgrp" 

Как вы можете видеть выше, я устанавливаю a = npy внутри подоболочки, а echo $ a должен возвращать npy. Однако я вижу ошибку, поскольку она не объявлена.

Может ли кто-нибудь сказать мне, как я могу установить env vars внутри подоболочки, используя <<

2 Solutions collect form web for “устанавливая переменные внутри подоболочки при использовании <<”

Конструкция << вводит документ оболочки, который обрабатывается так, как если бы это была строка с двумя кавычками, поскольку она считывается, поэтому переменные расширяются немедленно, когда они считываются оболочкой. Вы бы это поняли, если вы включите функцию оболочки, которая сообщает вам о неопределенных переменных. Я буду использовать эту функцию в оболочке BASH здесь:

 $ set -o nounset $ echo "$a" bash: a: unbound variable $ bash <<EOF > a=foo > echo "$a" > EOF bash: a: unbound variable 

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

 $ bash <<'EOF' > a=foo > echo "$a" > EOF foo $ bash <<EOF > a=foo > echo "\$a" > EOF foo 

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

ps Всегда дублируйте расширения переменных, чтобы они не вызывали несогласованные совпадения имени файла GLOB.

pps Включите проверку неопределенных переменных в ваших оболочках, чтобы поймать ошибки ввода. Это будет связано с вашей проблемой.

ppps Не используйте C-оболочки для скриптов. У них много ошибок и несоответствий

Вы используете здесь-документ, ограниченный строкой EONG .

При введении здесь документов с « <<word , независимо от того, распространяется ли этот документ на этот документ, зависит от того, цитируется ли какой-либо символ в слове . Когда ни один символ не цитируется, здесь-документ подлежит расширению параметров, замене команд и арифметическому расширению. Когда цитируется хотя бы один символ, здесь-документ не подлежит расширению; В оболочках Bourne и Korn (и POSIX) слово полностью исключено как конечный разделитель, а C-оболочки используют слово как есть.

Вы можете переписать свой пример как:

 #!/bin/csh echo "Before newgrp" /usr/bin/newgrp users <<"EONG" echo "hello from within newgrp" set a=npy echo $a id "EONG" echo "After newgrp" 

В противном случае, с неупомянутым словом , вам нужно избежать $a as \$a чтобы он не был заменен оболочкой, прежде чем передать его как stdin в newgrp :

 #!/bin/csh echo "Before newgrp" /usr/bin/newgrp users <<EONG echo "hello from within newgrp" set a=npy echo \$a id EONG echo "After newgrp" 
  • bash - как преобразовать несколько строк в одну строку для sh -c
  • как сохранить настройки скрипта?
  • Мониторинг файловой системы с использованием файла конфигурации
  • Можно ли запустить команду из bash и отправить ей нажатие клавиши
  • удаление данных из txt-файла
  • Сравнение столбцов в двух файлах и добавление первого файла
  • Как написать комбинацию сценариев Java / Shell, чтобы вы могли вызывать Java-программу как удаленную команду и все же поставлять локальный файл?
  • Как эффективно использовать сценарии bash (разные затраты на восстановление и хорошие привычки)?
  • Как запустить скрипт для получения определенного содержимого файла
  • Как пропустить первый аргумент в скрипте
  • Как передать логику в скрипте и поддерживать читаемость?
  • Linux и Unix - лучшая ОС в мире.