mk, sed e incorporando variáveis de ambiente [closed]

1

Ao usar mk , o GNU sed, eu acho que as variáveis não se expandem de forma alguma.

Código problemático:

VAR=qux
...
build:
    sed -i "s|FOO = .*|FOO = $VAR|" bar.file

Isso parece rodar o seguinte:

sed -i "s|FOO = .*|FOO = $VAR|" bar.file

quando eu quero que ele seja executado

sed -i "s|FOO = .*|FOO = qux|" bar.file

Eu tentei usar aspas simples e aspas duplas, como outros posts de troca de pilha mencionaram. A única instância que posso obter $VAR para expandir é quando não há cotações em torno dele. O que obviamente significa que sed não vê mais a expressão como uma expressão.

    
por Finn O'leary 20.08.2017 / 03:18

2 respostas

0

Acontece que, apesar de eu ter tentado anteriormente escapar dele, eu erroneamente coloquei aspas duplas assim:

sed -i 's|FOO = .*|FOO = '"$VAR"'|' bar.file

Alterando para

sed -i 's|FOO = .*|FOO = '$VAR'|' bar.file

funciona.

    
por 20.08.2017 / 03:26
2

Isto parece um fragmento em um Makefile.

Existem dois erros no arquivo:

  1. O comando sed de substituição usa | como delimitador, mas o delimitador médio é / .

  2. A variável do Makefile VAR é desreferenciada como $VAR em vez de $(VAR) ou ${VAR} .

Note que um Makefile não é um script de shell. Portanto, o Makefile a seguir é perfeitamente válido e produzirá a string qux world como saída no terminal:

VAR=    qux                                        

build:                                             
        @echo 'hello world' | sed 's|hello|$(VAR)|' 

Em um Makefile do Unix, $VAR se expandiria para o valor da variável V seguido pelas letras AR . Isso ocorre porque, a menos que seja indicado de outra forma, os nomes das variáveis são um único caractere. Se você tiver nomes de variáveis com vários caracteres, deverá colocar o nome inteiro em $(...) ou ${...} .

Obviamente, os Makefiles Plan9 podem ser diferentes a esse respeito.

ATUALIZAÇÃO:

O seguinte mkfile produz o valor correto ao usar mk 2.0, hello = qux :

VAR=qux

all:
        echo "hello = bar" | sed "s/= bar/= $VAR/"

Assim, a citação da pergunta parece correta para mim.

    
por 20.08.2017 / 08:27

Tags