Linux export не работает
Export - это одна из встроенных команд оболочки bash, поэтому она является неотъемлемой частью вашей командной строки. Она очень проста в использовании, так как синтаксис export допускает использование всего трех опций командной строки. В целом команда export отмечает переменную окружения для экспорта с любым новым дочерним процессом, и это позволяет дочернему процессу наследовать все отмеченные переменные. В данной статье этот процесс будет описан более подробно.
2. Часто используемые опции
-p
выводит список всех имен, экспортированных в текущей оболочке
-n
удаляет имена из списка экспорта
-f
имена экспортируются как функции
3. Основы export
Подумайте над следующим примером:
Строка 1: создается новая переменная с именем "a", содержащая строку "linuxcareer.com".
Строка 2: мы используем команду echo, чтобы вывести содержимое переменной "a".
Строка 3: мы создаем дочерний экземпляр оболочки bash.
Строка 4: переменная "a" теперь не определена.
Из приведенного выше примера можно видеть, что любой дочерний процесс, ответвляющийся от родительского процесса, по умолчанию не наследует переменные родителя. Для этого и нужна команда export. Что произойдет, если мы используем команду export в вышеприведенном примере?
Теперь в строке 3 мы использовали команду export, чтобы экспортировать переменную "a" в созданный новый дочерний процесс. В результате переменная "a" все еще содержит строку "linuxcareer.com", даже после создания нового экземпляра оболочки bash. Здесь важно отметить, что для успешного экспорта "a" необходимо, чтобы процесс, в который экспортируется переменная, ответвлялся от того родительского процесса, из которого экспортируется эта переменная. Связь между дочерним и родительским процессами описана ниже.
4. Дочерние и родительские процессы
В этом разделе мы коротко опишем взимосвязь между дочерним и родительским процессом. Все процессы могут быть родительскими и дочерними одновременно. Единственным исключением является процесс init, который всегда имеет PID (ID процесса) 1. Поэтому init является родительским для всех процессов, запущенных в системе Linux.
Любой создаваемый процесс имеет родительский процесс, из которого он создается, и может быть определен как потомок этого родительского процесса. Например:
Строка 1: вывести PID текущей командной оболочки - 27861
Строка 2: создать новый дочерний процесс из процесса с ID 27861
Строка 3: вывести PID текущей командной оболочки - 28034
Строка 4: вывести список дочерних процессов для PID 27861 с помощью команды ps
При создании нового дочернего процесса команда export просто обеспечивает, что все экспортируемые переменные родительского процесса доступны в дочернем процессе.
5. Использование команды export
Теперь, изучив основы, мы можем продолжить детальное исследование команды export. При использовании команды безо всяких опций и аргументов она просто выводит имена всех переменных, отмеченных для экспорта в дочерние процессы. То же самое происходит при использовании опции -p:
Как было показано выше, для экспорта переменной мы просто используем имя переменной в качестве аргумента команды export.
Как вы можете видеть, после экспорта переменной MYVAR, она будет показываться в списке экспортируемых переменных (строка 4). Приведенный выше пример можно сократить, используя команду export сразу при присваивании значения переменной.
Наиболее широко команда export применяется для объявления переменной оболочки PATH:
В этом примере мы включаем дополнительный путь /usr/local/bin в существующее определение PATH.
6. Экспорт функций командной оболочки
Используя опцию -f, команда export может быть также использована для экспорта функций. В примере ниже мы создаем функцию оболочки под именем printname, которая просто выводит строку "Linuxcareer.com" с помощью команды echo.
7. Удаление имен из списка экспорта
Выполнив один из вышеприведенных примеров, мы имеет переменную MYVAR, определенную в списке экспорта.
Чтобы удалить переменную из списка экспорта, необходимо использовать опцию -n.
8. Заключение
В этой статье рассмотрены основы использования команды export. Чтобы узнать больше подробностей, используйте команду:
Я пытаюсь настроить cocos2dx в Ubuntu 14.04 LTS, но после установки переменных окружения (в .bashrc) я начинаю получать эту ошибку:
bash: export: dev/cocos2d-x-3.2/tools/cocos2d-console/bin': not a valid identifier bash: export:/home/john/android': not a valid identifier bash: export: dev/android-ndk-r10b': not a valid identifier bash: export:dev/adt-bundle-linux-x86_64-20140702/sdk': not a valid identifier
И я не знаю, что сделать это.
Похоже, вы не сделали этого правильно.
Ошибки, которые вы получаете, означают, что пути (например, /home/john/android) являются которые используются как имена переменных, а не как значения, назначенные им.
Правильный синтаксис для назначения переменной - NAME=value. Правильный синтаксис для экспорта переменной (с любым значением, если оно уже было назначено) - export NAME. Правильный синтаксис для назначения и экспорта переменной (с назначенным значением) одновременно export NAME=value.
Я подозреваю, что вы пытаетесь сделать третью вещь, но используя неправильный синтаксис. Четыре распространенных ошибки, которые могут вызвать ошибки, например, то, что вы видите:
Использование пробелов вместо =. export NAME value неверно; value затем интерпретируется как имя последующей переменной для экспорта. (Это происходит потому, что export NAME1 NAME2 является правильным синтаксисом для экспорта нескольких переменных.) Помещение пробелов вокруг =. Во многих языках программирования, как правило, так и стилистически предпочтительнее использовать операторы с пробелами большую часть времени. Но чтобы присвоить значение переменной в сценарии оболочки (или в другой ситуации, когда вы выдаете команды оболочки), это недопустимо. NAME = value (в команде export или иначе) не будет работать; вы должны использовать NAME=value. (export NAME = value пытается экспортировать переменные с именем NAME, = и value. К счастью, это никогда не кажется успешным, поскольку попытка экспортировать переменную с именем = является синтаксической ошибкой. Напротив, export NAME= value , но не присваивает value NAME - вместо этого он присваивает пустую строку нулевой длины NAME и экспортирует ее, а отдельно экспортирует переменную value. Оба являются распространенными ошибками. ) Разделение частей значения переменной пробелами. Переменные среды могут содержать пробелы, но на практике они редко используются в качестве разделителей полей в переменных среды. Если одна переменная намеренно содержит несколько путей, обычно : используется для их разделения. Не цитирование пробелов при присваивании переменных. Иногда значение переменной среды должно содержать пробел. Например, это может быть имя каталога, в котором действительно содержится пробел. В этом случае необходимо процитировать любые пробелы. Один из способов сделать это - предшествовать им \. См. Как защитить круглые скобки, переданные команде cd? и Невозможно удалить файл для информации по другим путям - применяются методы, представленные в ответах, хотя ни один вопрос не связан с назначением переменных среды. Например, несколько способов экспортировать переменную среды SILLYPATH со значением /home/ek/silly name/bin: export SILLYPATH=/home/ek/silly\ name/bin export SILLYPATH='/home/ek/silly name/bin' export SILLYPATH="/home/ek/silly name/bin" Часто, когда папка, которую вы должны использовать в оболочке или назначать широко используемой среде переменная содержит пробел, это может быть полезно при переименовании. (Но иногда это непрактично или нежелательно.)
приведенный ниже код не работает в bash, где, работая с sh, он пробовал много обходных путей, таких как вставка после чтения канала, но не сработал.Переменные не экспортируются. кто-нибудь может подсказать что нужно сделать
1 ответ 1
Здесь есть ряд ошибок. Позвольте мне пройти их по порядку:
Элементы конвейера (например, команда read здесь) выполняются в подоболочках, что означает, что присвоенные им переменные происходят в подоболочке . и теряются при выходе из подоболочки. Кроме того, вы не можете иметь пробел в середине имени переменной ( var 2 ).
Вы можете сделать это без трубы, как это:
Даже после удаления блуждающего пространства из второй строки, они не делают ничего полезного. Они принимают значения переменных, выводят их, записывают выходные данные команд echo и вставляют их обратно в переменные. По пути могут произойти некоторые изменения (например, расширение по шаблону), но я почти уверен, что это не то, чего вы хотите, чтобы происходило. (На самом деле, вы почти всегда должны помещать ссылки на переменные в двойные кавычки, чтобы предотвратить такие вещи, как неожиданное расширение подстановочных знаков и разбиение слов.) Так что просто потеряй это.
export указывает оболочке экспортировать значение этих переменных в команды, которые вы запускаете из этой оболочки - то есть они экспортируются по иерархии процессов, а не до того, что выполнялось. Но в этом случае функция выполняется в том же процессе, что и основная часть скрипта, поэтому нет необходимости в импорте для совместного использования переменных в обоих направлениях. Пока переменные не объявлены как local , они автоматически доступны для остальной части скрипта. Так что потерять это тоже.
(Обратите внимание, что нет способа экспортировать переменные вверх по иерархии процесса. То, что происходит в подоболочке или другом подпроцессе, остается в этом подпроцессе.)
Вам нужно $ перед EACH_RECORD , иначе он будет просто передан в виде литеральной строки.
Я хочу выполнить некоторую команду Unix из скрипта PHP. Код приведен ниже:
Теперь проблема в том, что exec('export HFT_BASEDIR='.$filepath); не работает, и по этой причине отображается много ошибок. Есть ли какой-либо альтернативный вариант выполнения той же команды?
2 ответа
В xcode это хорошая идея, чтобы генерировать документацию во время сборки вашей библиотеки.. Я использую команду headerdoc2HTML . чтобы заставить ее работать с фазой сборки, я добавил ее в сценарий фазы сборки (сценарий shell) следующим образом: headerdoc2html -o outputPath myHeader.h Но это.
Это работает просто отлично. Но shell, в котором вы его выполняете, умирает до того, как возвращается вызов функции. Вместо этого попробуйте putenv() .
переменные среды являются локальными для процессов, экспорт только указывает shell передать эти переменные дочерним процессам.
Похожие вопросы:
Я новичок в shell скриптах и sed командах. Следующая команда sed работает в Solaris, но выдает ошибку в Linux: sed -n 's/^[a-zA-z0-9][a-zA-z0-9]*[ ][.
Я пытаюсь выполнить команду linux в своем коде java. Он должен изменить разрешения для некоторого каталога. Вот моя попытка: String Cmd = echo myPassword | sudo -S chmod 777 -R /home/somePath;.
В xcode это хорошая идея, чтобы генерировать документацию во время сборки вашей библиотеки.. Я использую команду headerdoc2HTML . чтобы заставить ее работать с фазой сборки, я добавил ее в.
cat t.incopt.02.20110221 | awk -F, '' | sort | uniq есть самобытная записи но если я вставлю в perl, @FETCH_REQ_DETAILS = `cat t.incopt.02.20110221 | awk -F\, '' \| sort \|.
Я немного новичок в Linux, и мне случается выполнять некоторые команды вслепую, чтобы добиться цели. Я подумал, что задавать подобные вопросы не будет пустой тратой времени, так как все больше новых.
javac -cp .:gson-2.3.1.jar:commons-io-2.4.jar File.java Приведенная выше команда работает на одной из моих машин linux. Однако он не работает на другом, даже если это тот же дистрибутив! (Debian).
Я использую testcafe для своей автоматизации. В соответствии с документацией установите переменные окружения Я использую set для windows запуска локально и export для запуска тестов в среде Linux с.
Главное меню » Linux » Объяснение команды export в Linux
или сокращение как здесь, чтобы присвоить значение сразу:
Вы можете увидеть значение экспортируемых переменных с помощью команды echo :
Чтобы сделать изменения постоянными, вы должны добавить их в файл
Это было просто краткое изложение. Давайте посмотрим ее в деталях, чтобы лучше понять.
Понимание того, как работает команда export
В приведенном ниже примере мы объявляем переменную оболочки var и присваиваю ей значение 3. Пока это переменная оболочки.
Если мы выйдем из терминала и откроем новый терминал, эта переменная оболочки исчезнет. Если мы хотим использовать эту переменную в сценарии оболочки, она не будет работать. Точно так же, если мы переключаем пользователя (и, таким образом, запускаю новую оболочку с этим пользователем), эта переменная оболочки не будет доступна:
Теперь вернемся к предыдущему пользователю (и, таким образом, к предыдущей оболочке, где мы объявили переменную оболочки). Вы можете видеть, что переменная все еще существует здесь (потому что мы еще не завершили эту сессию оболочки):
Итак, теперь, если мы используем здесь команду экспорта для переменной var, она станет переменной окружения и будет доступна для всех вложенных оболочек, пользователей и сценариев оболочки в этом сеансе.
Вы можете проверить все переменные окружения, используя команду printenv:
Сделать экспортированные переменные оболочки «постоянными» с помощью файла bashrc
Но борьба не заканчивается здесь. Если вы закроете сеанс, выйдете из терминала, выйдете из системы или перезагрузите систему, ваша переменная среды снова исчезнет.
Вот почему принято добавлять команду export в файл конфигурации среды выполнения (rc) вашей оболочки.
Читать Как измерить и показать прогресс копирования rsync в Linux?Каждая оболочка имеет этот rc-файл, расположенный в домашнем каталоге пользователя, который используется для определения переменных и другой конфигурации при запуске оболочки. Как пользователь, вы можете использовать этот файл rc для настройки вашей оболочки и ее поведения.
Если вы используете оболочку bash, у вас должен быть файл bashrc в
/.bashrc. Вы можете отредактировать этот файл в текстовом редакторе, таком как Vim, или просто добавить к нему файл export var = 3 (или что-либо, что вы экспортируете).
Сделав это, вы должны использовать исходную команду, чтобы сделать изменения доступными немедленно.
Хорошей практикой является хранение всех пользовательских переменных среды в одном месте.
Зачем использовать команду экспорта?
Например, если вы установили maven и хотите иметь возможность его запустить, вы должны добавить в каталог расположение исполняемых файлов maven следующим образом:
Что оно делает? Он добавляет это местоположение каталога к пути. Когда вы пытаетесь запустить команду в Linux, ваша система ищет ее исполняемый файл (обычно в каталоге bin) в каталогах, упомянутых в переменной PATH.
Мы настоятельно рекомендуем прочитать о структуре каталогов Linux, чтобы иметь лучшее представление.
Бонус Совет: удалить переменную из списка экспорта
Мы надеемся, что у вас теперь создалось представление о команде export в Linux. Если у вас есть сомнения, пожалуйста, не стесняйтесь спрашивать в разделе комментариев.
Если вы нашли ошибку, пожалуйста, выделите фрагмент текста и нажмите Ctrl+Enter.
Читайте также: