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

Я использую следующий метод для передачи команд в подоболочку, которая запускается «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" 
  • Сохранение строк повторяется определенное количество раз
  • Перенаправление ввода с использованием команды и параметров
  • Сед найти и заменить косой чертой
  • Поддерживают ли оболочки рекурсию?
  • Сценарий оболочки работает на терминале, а не когда он запускается cronjob
  • grep: Не признанный флаг в AIX
  • awk проверить и распечатать, когда это правда
  • Скрипты не могут запускаться одновременно при запуске
  • конкатенация строки в оболочке
  • Что делает «while test $ # -gt 0»?
  • Извлечь определенный текст из переменной в сценарии оболочки
  • Interesting Posts

    Есть ли простой в установке дистрибутив со всеми необходимыми инструментами для компиляции (make, autotools и т. Д.)?

    Как настроить Sendmail в тюрьме, чтобы получить правильное полное доменное имя?

    Скопировать / Переместить всю папку, но с определенными расширениями

    Практическое руководство. Скрипты Autorun после входа пользователя в систему

    Настройка статических маршрутов по умолчанию с помощью RIPv2

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

    Ручная настройка IP-адресов на гостевой установке RHEL 7 KVM

    Может ли systemd и upstart совместно сосуществовать в системе Unix?

    Вставить несколько файлов на основе первого столбца в один файл

    Исходные IP-адреса белых списков в CentOS 7

    Переключитесь в ОЗУ или нет

    Linux Mint 18 удаляет /etc/init.d/xorg.conf при каждой перезагрузке и не запускает x-сервер

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

    Почему мой xl2tpd не набирает номер?

    Возврат карты без другого ввода в псевдоним

    Linux и Unix - лучшая ОС в мире.