Переменные, которые работают везде - PullRequest
0 голосов
/ 22 марта 2009

Как я могу установить переменные, которые работают везде? Мой .bashrc имеет:

Questions='/Users/User/Stackoverflow/Questions'

Address='My address'

Мой файл имеет:

$Questions
$Addres

Команда «$ cat my_file» в командной консоли выводит «$ Questions» и «$ Address» вместо «/ Users / User / Stackoverflow / Questions» и «Мой адрес». Другие места, где я хотел бы иметь переменные, это электронная почта и браузер. Но я не могу заставить их работать.

Как мои переменные могут работать в каждой программе?

Ответы [ 7 ]

5 голосов
/ 22 марта 2009

cat не интерпретирует переменные. Он просто распечатывает содержимое файла, побайтово.

Если вы хотите иметь возможность печатать значения переменных с помощью my_file, я бы предложил изменить его на

echo "$Questions"
echo "$Address"

Затем вы можете «найти» его (вроде как запустить его в текущей среде оболочки) с помощью

$ source my_file

или

$ . my_file

Возможно, вам также придется использовать export в .bashrc, например:

export Questions='/Users/User/Stackoverflow/Questions'
export Address='My address'
2 голосов
/ 23 марта 2009

Вы можете заставить "кошачью" вещь работать, используя некоторую мерзость:

eval "$ (printf 'cat << END \ n% s \ nEND'" $ (<foo) ")" </p>

Где "foo" - это файл, содержащий ваш текст, из которого вы хотите расширить параметры bash. Это решение в основном просто конвертирует текст в документ здесь, который расширяет параметры bash.

cat <<END
[your text]
END

Ограничения:

У вас не может быть строки с просто «END» в текстовом файле, иначе решение не удастся. Он будет думать, что строка с «END» в текстовом файле заканчивает документ здесь, а не «END» в команде printf, и вывод завершится рано.

ТВН:

Это то, что вы просто не должны делать . Если вы хотите создавать файлы шаблонов, найдите систему шаблонов, созданную для этого. Вы не должны насиловать Баша на то, что он не создан. Это язык сценариев, а не система шаблонов. Он создан для синтаксического анализа сценариев с четко определенным синтаксисом, а не произвольных текстовых файлов.

2 голосов
/ 22 марта 2009

Как мои переменные могут работать в каждой программе?

Ты не можешь. Bash и cat - две отдельные программы. Вы устанавливаете переменную bash, это не значит, что cat будет вести себя как bash, чтобы интерпретировать ее. $VARNAME - это синтаксис оболочки, cat - это другая программа, которая почти ничего не разделяет с оболочкой.

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

Вместо этого вы можете использовать sed для выполнения замены текстового шаблона:

sed -e "s|@QUESTIONS@|$Questions|g; s|@ADDRESS@|$Address|g" file.txt

Это заменит все экземпляры @QUESTIONS@ и @ANSWERS@ в файле содержимым переменных оболочки $Questions и $Address. Обратите внимание, что эти переменные оболочки не должны содержать символы канала ("|"), поскольку в предложении они используются в качестве разделителей.

1 голос
/ 22 марта 2009

Вы не можете. Чтобы сделать это, вам понадобится сотрудничество каждого писателя почтового клиента, каждого писателя браузера, каждого писателя утилит.

0 голосов
/ 25 марта 2009

Просто добавьте в ваш ~ / .profile или в ~ / .bashrc:

export Questions='/Users/User/Stackoverflow/Questions'
export Address='My address'
0 голосов
/ 22 марта 2009

Из вашего комментария на Ответ Пола Томблина :

Ты уверен? Я слышал, что вы можете иметь все виды вещей, как RSS-ридер в Emacs. Возможно, есть лучшее сотрудничество. Я пользователь VIM, поэтому я не знаю. Если кто-то знает, хорошо ли Emacs сотрудничает между программами, пожалуйста, не стесняйтесь делиться своими знаниями. - UnixBasics (3 минуты назад)

Вам нужен (или вы будете удовлетворены) редактор, который может расширять переменные вашей среды?

Это другая (то есть более простая и возможная) проблема.


На чисто теоретическом уровне, я полагаю, взломанная файловая система может делать то, что вы хотите, но она, безусловно, сломает все виды бинарного хранилища. Поэтому мы добавляем флаг файловой системы для текстовых (расширяемых) и нетекстовых типов файлов. И нам нужно, чтобы файловая система знала, какой набор переменных нужно расширять, и до тошноты ...

0 голосов
/ 22 марта 2009

Введите env посмотрите, существуют ли переменные.

Если это так, попробуйте позвонить им с ${VAR_NAME}.

После повторения я теперь вижу вашу проблему. Вы просто не можете получить текстовый файл, cat его содержимое и ожидать, что переменные окружения будут проанализированы. Вы просто не можете.

Если бы это был файл сценария bash, и вы должны были его запустить, вы могли бы echo извлечь переменные, и они были бы проанализированы, как вы хотите.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...