Ответ 1
Если вы не уверены, вы можете использовать запрос "cols" на терминале и забыли COLUMNS:
COLS=$(tput cols)
Я пробовал в форме 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"
Предложения?
Если вы не уверены, вы можете использовать запрос "cols" на терминале и забыли COLUMNS:
COLS=$(tput cols)
Просто краткое примечание/резюме для всех, кто пришел сюда через Google, ища ответ на общий вопрос, заданный в названии (как и я). Любое из следующих действий должно работать для получения доступа к переменным оболочки внутри кавычек:
echo "$VARIABLE"
echo "${VARIABLE}"
Использование одиночных кавычек является основной проблемой. В соответствии с Bash Справочное руководство:
Вложения символов в одинарных кавычках (
'
) сохраняют буквальное значение каждого символа в кавычках. Одинарная кавычка может отсутствовать между одинарными кавычками, даже если ей предшествует обратная косая черта. [...] Закрывающие символы в двойных кавычках ("
) сохраняют литеральное значение всех символов в кавычках, за исключением$
,`
,\
, и, когда расширение истории включено,!
. Символы$
и `сохраняют свое особое значение в двойных кавычках (см. Раздел "Расширения оболочки" ). Обратная косая черта сохраняет свое особое значение только тогда, когда следует один из следующих символов:$
,`
,"
,\
или новая строка. В двойных кавычках удаляются обратные косые следы, сопровождаемые одним из этих символов. Обратные косые черты, предшествующие символам без особого значения, остаются неизмененными. Двойная кавычка может быть заключена в двойные кавычки, предшествуя ей обратным слэшем. Если включено, расширение истории будет выполнено, если только!
, появляющееся в двойных кавычках, не будет выполнено с помощью обратного слэша. Обратная косая черта, предшествующая!
, не удаляется. Специальные параметры*
и@
имеют особое значение, когда в двойных кавычках (см. Расширение параметров оболочки).
В конкретном случае, заданном в вопросе, $COLUMNS - это специальная переменная, которая имеет нестандартные свойства (см. ответ lhunath выше).
Обратите внимание, что COLUMNS
:
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
; -))
Следующий script работает для меня для нескольких значений $COLUMNS
. Интересно, не устанавливаете ли вы COLUMNS
перед этим вызовом?
#!/bin/bash
COLUMNS=30
svn diff [email protected] --diff-cmd /usr/bin/diff -x "-y -w -p -W $COLUMNS"
Можете ли вы повторить $COLUMNS
внутри своего script, чтобы убедиться, что он установлен правильно?
Вы делаете это правильно, поэтому я предполагаю, что что-то другое виновато (а не экспортировать 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 отдельно отдельно (подход "снизу вверх" ).