Como alterar a interpretação de uma variável em 'zsh'?

1

Eu defino uma variável TEMPP='-I ../dir1 -I ../dir2'

então eu corro

gcc -M $TEMPP somefile.c

Parece não incluir ../dir1 e ../dir2 na lista de pesquisa do arquivo de inclusão, e se houver um espaço no início da variável, como

TEMPP=' -I ../dir1 -I ../dir2'

relata um erro:

gcc: -I ../common1 -I ../encrypt: No such file or directory

parece que a variável foi tratada como um arquivo.

Talvez me permita separar o diretório para evitar esse promblulo, mas aqueles incluídos dirs são gerados por outro comando e a quantidade não é constante.

Então, como posso deixar uma variável em um comando ser tratada como literal parecer uma entrada manual na linha de comando, não uma string integral ou um nome de arquivo?

OK ... acho que esta situação só aconteceu no zsh , mas no bash funciona bem ... pode estar em zsh a expansão da variável é especial.

Então, se alguém pode me dizer como isso pode funcionar bem em zsh eu vou apreciar, ou eu só posso fazer isso em bash.

    
por wind 24.10.2011 / 05:28

2 respostas

1

Em zsh, diferentemente de outros shells no estilo Bourne, os resultados de uma substituição de variável não são divididos em palavras interpretadas como padrões de caractere curinga. Então, em zsh, se você escreve

a='hello *.txt'
echo $a

então você vê hello *.txt , ao contrário de outros shells, onde você verá algo como hello bar.txt foo.txt .

Você pode ativar a divisão de palavras para uma expansão com $=TEMPP . Você pode ativar a divisão de palavras para todas as expansões com setopt sh_word_split ou emulate sh .

Você deve colocar esses comandos em um makefile e permitir que um shell estilo Bourne real (o que estiver instalado como /bin/sh ) os execute. Mantenha o zsh para uso interativo e seus próprios scripts.

    
por 25.10.2011 / 01:52
2

Eu acredito que você esteja tentando controlar se o espaço em branco em "$TEMPP" é interpretado ou não. (Note que este não é um problema do CCG, é o seu shell que está analisando a linha de comando).

Aqui está o que bash faz:

$ F="foo bar baz"
$ for f in $F; do echo $f; done
foo
bar
baz

E aqui está o que zsh faz:

$ F="foo bar baz"
$ for f in $F; do echo $f; done
foo bar baz

Você precisa obter zsh para interpretar o espaço em branco. Pode haver uma maneira elegante de fazer isso em zsh (não sei, mas se você refizer e marcar sua pergunta, poderá obter respostas mais úteis). Isso deve funcionar em torno do problema, mas é um pouco pesado para esse problema:

eval gcc -M $TEMPP somefile.c
    
por 24.10.2011 / 07:36