Подтвердить что ты не робот

Как использовать переменную среды внутри строки с кавычками в Bash

Я пробовал в форме bash script следующие формы:

#!/bin/bash
svn diff [email protected] --diff-cmd /usr/bin/diff -x "-y -w -p -W $COLUMNS"

Но я не могу заставить синтаксис правильно расширять переменную среды COLUMNS.

Я пробовал различные формы:

svn diff [email protected] --diff-cmd /usr/bin/diff -x '-y -w -p -W $COLUMNS'

и

svn diff [email protected] --diff-cmd /usr/bin/diff -x '-y -w -p -W ${COLUMNS}'

и

eval svn diff [email protected] --diff-cmd /usr/bin/diff -x "-y -w -p -W $COLUMNS"

Предложения?

4b9b3361

Ответ 1

Если вы не уверены, вы можете использовать запрос "cols" на терминале и забыли COLUMNS:

COLS=$(tput cols)

Ответ 2

Просто краткое примечание/резюме для всех, кто пришел сюда через Google, ища ответ на общий вопрос, заданный в названии (как и я). Любое из следующих действий должно работать для получения доступа к переменным оболочки внутри кавычек:

echo "$VARIABLE"
echo "${VARIABLE}"

Использование одиночных кавычек является основной проблемой. В соответствии с Bash Справочное руководство:

Вложения символов в одинарных кавычках (') сохраняют буквальное значение каждого символа в кавычках. Одинарная кавычка может отсутствовать между одинарными кавычками, даже если ей предшествует обратная косая черта. [...] Закрывающие символы в двойных кавычках (") сохраняют литеральное значение всех символов в кавычках, за исключением $, `, \, и, когда расширение истории включено, !. Символы $ и `сохраняют свое особое значение в двойных кавычках (см. Раздел "Расширения оболочки" ). Обратная косая черта сохраняет свое особое значение только тогда, когда следует один из следующих символов: $, `, ", \ или новая строка. В двойных кавычках удаляются обратные косые следы, сопровождаемые одним из этих символов. Обратные косые черты, предшествующие символам без особого значения, остаются неизмененными. Двойная кавычка может быть заключена в двойные кавычки, предшествуя ей обратным слэшем. Если включено, расширение истории будет выполнено, если только !, появляющееся в двойных кавычках, не будет выполнено с помощью обратного слэша. Обратная косая черта, предшествующая !, не удаляется. Специальные параметры * и @ имеют особое значение, когда в двойных кавычках (см. Расширение параметров оболочки).

В конкретном случае, заданном в вопросе, $COLUMNS - это специальная переменная, которая имеет нестандартные свойства (см. ответ lhunath выше).

Ответ 3

Обратите внимание, что COLUMNS:

  • НЕ переменная среды. Это обычный параметр bash, который устанавливается самим bash.
  • Установить автоматически после получения сигнала SIGWINCH.

Эта вторая точка обычно означает, что ваша переменная COLUMNS будет установлена ​​только в вашей интерактивной оболочке не в bash script.

Если ваш script stdin подключен к вашему терминалу, вы можете вручную просмотреть ширину вашего терминала, запросив свой терминал:

tput cols

И использовать это в своей команде SVN:

svn diff "[email protected]" --diff-cmd /usr/bin/diff -x "-y -w -p -W $(tput cols)"

(Примечание: вы должны процитировать "[email protected]" и держаться подальше от eval; -))

Ответ 4

Следующий script работает для меня для нескольких значений $COLUMNS. Интересно, не устанавливаете ли вы COLUMNS перед этим вызовом?

#!/bin/bash
COLUMNS=30
svn diff [email protected] --diff-cmd /usr/bin/diff -x "-y -w -p -W $COLUMNS"

Можете ли вы повторить $COLUMNS внутри своего script, чтобы убедиться, что он установлен правильно?

Ответ 5

Вы делаете это правильно, поэтому я предполагаю, что что-то другое виновато (а не экспортировать COLUMNS?).

Уловкой для отладки этих случаев является создание специализированной команды (закрытие для парней языка программирования). Создайте оболочку script с именем diff-columns:

exec /usr/bin/diff -x -y -w -p -W "$COLUMNS" "[email protected]"

и просто используйте

svn diff "[email protected]" --diff-cmd  diff-columns

Таким образом, ваш код чище для чтения и более модульный (подход сверху вниз), и вы можете протестировать код diff-columns отдельно отдельно (подход "снизу вверх" ).