глобальные переменные среды в сценарии оболочки

<p>как установить глобальную переменную среды в скрипте bash?</p><p>если я делаю что-то вроде</p><pre><code>#!/bin/bash foo=bar </code></pre><p>...или же</p><pre><code>#!/bin/bash export foo=bar </code></pre><p>... кажется, что переменные остаются в локальном контексте, в то время как я хотел бы продолжать использовать их после завершения выполнения скрипта.</p>

<p>запустите ваш скрипт с помощью <code>.</code></p><pre><code>. myscript.sh </code></pre><p>это запустит скрипт в текущей среде shell.</p><p><code>export</code> определяет, какие переменные будут доступны новым процессам, поэтому, если вы скажете</p><pre><code>foo=1 export bar=2 ./runscript.sh </code></pre><p>тогда <code>$bar будет доступен в среде runscript.sh, а $foo</code> - нет.</p>

<p>когда вы <em> запускаете </em> сценарий оболочки, он выполняется в вложенной оболочке, поэтому он не может влиять на среду родительской оболочки. вы хотите получить скрипт, выполнив:</p><pre><code>. ./setfoo.sh </code></pre><p>это выполняется в контексте <em> текущей </em> оболочки, а не как <em> подпрограммы </em> ракушка.</p><p>со страницы руководства bash:</p><blockquote> <p><strong>. filename [arguments]</strong><br> <strong>исходное имя файла [аргументы]</strong></p> <p>чтение и выполнение команд из имени файла в текущей среде оболочки и возвращение состояния выхода последней команды, выполненной из имени файла.</p> <p>если имя файла не содержит косую черту, имена файлов в path используются для поиска каталога, содержащего имя файла.</p> <p>файл, который ищется в path, не обязательно должен быть исполняемым. когда bash не находится в режиме posix, текущий каталог ищется, если в path не найдено ни одного файла.</p> <p>если опция sourcepath для встроенной команды shopt отключена, path не ищется.</p> <p>если предоставляются какие-либо аргументы, они становятся позиционными параметрами при выполнении имени файла.</p> <p>в противном случае позиционные параметры не изменяются. статус возврата - это статус последней команды, вышедшей из скрипта (0, если команды не выполняются), и false, если имя файла не найдено или не может быть прочитано.</p> </blockquote>

<p><code>source myscript.sh</code> также возможен.</p><p>описание для команды linux <code>source</code>:</p><pre><code>source is a unix command that evaluates the file following the command, as a list of commands, executed in the current context </code></pre>

<pre><code>#!/bin/bash export foo=bar </code></pre><p>или же</p><pre><code>#!/bin/bash foo=bar export foo </code></pre><p><em>человек экспорт:</em></p><p>командная консоль должна присвоить атрибут экспорта переменным, соответствующим указанным именам, что должно привести к тому, что они окажутся в среде последующих выполняемых команд. если за именем переменной следует = word, тогда значение этой переменной должно быть установлено в word.</p>