Pergunta

Eu tentei várias formas do seguinte em um script:

#!/bin/bash
svn diff $@ --diff-cmd /usr/bin/diff -x "-y -w -p -W $COLUMNS"

Mas eu não posso obter a sintaxe para expandir corretamente a variável de ambiente COLUMNS.

Eu tentei várias formas do seguinte:

svn diff $@ --diff-cmd /usr/bin/diff -x '-y -w -p -W $COLUMNS'

e

svn diff $@ --diff-cmd /usr/bin/diff -x '-y -w -p -W ${COLUMNS}'

e

eval svn diff $@ --diff-cmd /usr/bin/diff -x "-y -w -p -W $COLUMNS"

Sugestões?

Foi útil?

Solução

Se não tiver certeza, você pode usar o pedido dos cols 'no terminal, e esquecer colunas:

COLS=$(tput cols)

Outras dicas

Basta uma rápida nota / resumo para qualquer um que veio aqui via Google procurando a resposta para a pergunta geral pediu no título (como eu estava). Qualquer um dos seguintes deve trabalhar para obter acesso a variáveis ??do shell dentro de aspas:

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

O uso de aspas simples é a questão principal. De acordo com a Bash Manual de Referência :

personagens que encerram em aspas simples (') preserva o valor literal de cada personagem dentro das aspas. A única citação não pode ocorrer entre aspas simples, mesmo quando precedido por uma barra invertida. [...] Anexando caracteres entre aspas duplas (") preserva o valor literal de todos os caracteres entre as aspas, com exceção de $, `, \, e, quando a expansão história está habilitado, !. Os personagens $ e `mantêm o seu significado especial dentro de aspas duplas (ver Shell Expansões). A barra invertida mantém o seu significado especial apenas quando seguido por um dos seguintes caracteres: $, `, ", \, ou nova linha. Dentro de aspas duplas, barras invertidas que são seguidos por um dos seguintes caracteres são removidos. Barras invertidas anteriores caracteres sem um significado especial são deixados sem modificações. Uma citação dupla pode ser citado dentro de aspas duplas precedendo-o com uma barra invertida. Se habilitado, expansão a história vai ser realizada a menos que um ! aparecer entre aspas é escapado usando uma barra invertida. A barra invertida antes da ! não é removido. Os parâmetros * e @ especial tem um significado especial quando entre aspas duplas (ver Shell Parâmetro de Expansão).

No caso específico solicitado na pergunta, $ COLUNAS é uma variável especial que tem propriedades diferentes do padrão (ver resposta de lhunath acima).

Note que COLUMNS é:

  1. não uma variável de ambiente. É um parâmetro de festa comum, que é definido por si só bash.
  2. Definir automaticamente após a recepção de um sinal SIGWINCH.

Esse segundo ponto normalmente significa que sua variável COLUMNS só será definido em sua interativa shell, não em um script bash.

Se stdin do seu script é conectado ao seu terminal, você pode olhar manualmente a largura de seu terminal, solicitando o seu terminal:

tput cols

E para usar isso em seu comando SVN:

svn diff "$@" --diff-cmd /usr/bin/diff -x "-y -w -p -W $(tput cols)"

(Nota: você deve Citação "$@" e ficar longe de eval; -))

O script a seguir funciona para mim por vários valores de $COLUMNS. Pergunto-me se você não está definindo COLUMNS antes desta chamada?

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

Você pode ecoar $COLUMNS dentro do seu script para ver se ele está ajustado corretamente?

Você está fazendo a coisa certa, então eu acho que algo mais está em falta (não COLUNAS?-Ing exportação).

Um truque para depurar esses casos é fazer com que um comando especializado (um fecho para a programação caras idioma). Criar um script shell nomeados diff-colunas fazendo:

exec /usr/bin/diff -x -y -w -p -W "$COLUMNS" "$@"

e usar apenas

svn diff "$@" --diff-cmd  diff-columns

Desta forma, seu código é mais limpo de ler e mais modular (abordagem top-down), e você pode testar o código diff-colunas thouroughly separadamente (abordagem bottom-up).

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top