Я пробовал различные формы следующего в сценарии bash:
#!/bin/bash
svn diff $@ --diff-cmd /usr/bin/diff -x "-y -w -p -W $COLUMNS"
Но я не могу заставить синтаксис правильно расширять COLUMNS
переменную среды.
Я пробовал различные формы следующего:
svn diff $@ --diff-cmd /usr/bin/diff -x '-y -w -p -W $COLUMNS'
а также
svn diff $@ --diff-cmd /usr/bin/diff -x '-y -w -p -W ${COLUMNS}'
а также
eval svn diff $@ --diff-cmd /usr/bin/diff -x "-y -w -p -W $COLUMNS"
Предложения?
bash
quotes
environment
Джейми
источник
источник
svn diff $@ --diff-cmd /usr/bin/diff -x "-y -w -p -W ""$COLUMNS"
$@
кавычек делает его точно таким же, как$*
- то есть, он разбивается"foo bar"
на два отдельных аргумента,foo
иbar
. Если вы хотите сохранить исходный список аргументов в том виде, в каком он был вам предоставлен, вы этого хотите"$@"
.Ответы:
Если вы не уверены, вы можете использовать запрос cols на терминале и забыть COLUMNS:
источник
Просто краткое примечание / резюме для всех, кто пришел сюда через Google в поисках ответа на общий вопрос, заданный в заголовке (как и я). Любое из следующих действий должно работать для получения доступа к переменным оболочки внутри кавычек:
echo "$VARIABLE" echo "${VARIABLE}"
Использование одинарных кавычек - основная проблема. Согласно справочному руководству Bash :
В конкретном случае, заданном в вопросе, $ COLUMNS - это специальная переменная, которая имеет нестандартные свойства (см. Ответ lhunath выше).
источник
'before'"$variable"'after'
(как указано в этом ответе: stackoverflow.com/a/13802438/2254346 )Обратите внимание, что
COLUMNS
это:SIGWINCH
сигнала.Этот второй пункт обычно означает, что ваша
COLUMNS
переменная будет установлена только в вашей интерактивной оболочке, а не в сценарии bash.Если ваш скрипт
stdin
подключен к вашему терминалу, вы можете вручную посмотреть ширину вашего терминала, спросив свой терминал:И чтобы использовать это в своей команде SVN:
svn diff "$@" --diff-cmd /usr/bin/diff -x "-y -w -p -W $(tput cols)"
(Примечание: вы должны цитировать
"$@"
и держаться подальшеeval
;-))источник
Следующий сценарий работает для меня для нескольких значений
$COLUMNS
. Интересно, не настраиваете ли выCOLUMNS
до этого звонка?#!/bin/bash COLUMNS=30 svn diff $@ --diff-cmd /usr/bin/diff -x "-y -w -p -W $COLUMNS"
Можете ли вы повторить эхо
$COLUMNS
в своем скрипте, чтобы увидеть, правильно ли он настроен?источник
$@
- разделяет один параметр"two words"
на два отдельных параметраtwo
иwords
. Должен быть"$@"
передан список аргументов в точности так, как он был задан.Вы делаете это правильно, поэтому я предполагаю, что виновата что-то еще (не экспорт COLUMNS?).
Уловка для отладки этих случаев состоит в том, чтобы создать специализированную команду (закрытие для тех, кто занимается языком программирования). Создайте сценарий оболочки с именем diff-columns, выполняя:
exec /usr/bin/diff -x -y -w -p -W "$COLUMNS" "$@"
и просто используйте
svn diff "$@" --diff-cmd diff-columns
Таким образом, ваш код будет более чистым для чтения и более модульным (подход сверху вниз), и вы можете тщательно протестировать код с разными столбцами (подход снизу вверх).
источник