Что на самом деле происходит с обратными ударами bash?

2590
Andrew Wood

Я всегда думал о обратных галочках в bash как о «выполнении вывода 'some_command'». Что происходит в следующем ... рассмотрим скрипт, myscript.plкоторый печатает следующий текст:

 export PS1 = "[STRING] $ PS1" 

Если я скопирую вывод из cat file.txtкомандной строки и выполню, «[STRING]» будет добавлено в начало моей подсказки.

С другой стороны, ответная реакция 'myscript.pl'заставляет меня подсказать "[STRING]. Что происходит?

1
Извините за форматирование - я не мог получить галочки для отображения в блоке кода. Andrew Wood 13 лет назад 0

1 ответ на вопрос

3
grawity

bashне выполняет вывод команды backtick, только подставляет ее. (Функция называется подстановкой команд в конце концов.)

Если подстановка не заключена в двойные кавычки, для вывода команды выполняется разделение слов, но кавычки и другие специальные символы игнорируются; export PS1="[STRING] $PS1"просто делится $IFSна:

  • export
  • PS1="[STRING
  • $PS1"

Если вы хотите выполнить содержимое файла, поставьте его:

, ./file.txt 

или не POSIX:

источник ./file.txt 

Если вы хотите, чтобы весь стандартный синтаксический анализ применялся к подстановке - например, к переменной - вы можете использовать eval "$commands"или eval "$(foo)"илиeval "`foo`" . Но будь очень осторожен с этим.

Позвольте мне уточнить мой вопрос. На самом деле я не храню команды в текстовом файле, но подумал, что это будет хорошим способом узнать о моей проблеме. У меня есть скрипт Perl для настройки переменных окружения. Чтобы не потерять текущую среду (не совсем правильное слово - псевдонимы, функции, переменные оболочки и т. Д.), У меня есть сценарий dump _changes_ в среду, который, как мы надеемся, пользователь сможет применить, используя обратные ссылки для вызова скрипт. Andrew Wood 13 лет назад 0
Однако я вижу, что eval стоит перед моими работами с выражением в обратном порядке, как я хотел бы Andrew Wood 13 лет назад 0
@ajwood: Позвольте мне указать последний абзац моего ответа. (** Не забывайте цитаты. ** В противном случае материал ломается.) grawity 13 лет назад 0