O que há de errado com tal uso do utilitário sed em backticks?

0

Estou executando um shell mingw / msys em um Windows de 64 bits e abaixo está minha sessão.

USER@FX8300 ~
$ echo $WD
C:\Users\USER\Desktop\msys\bin\

USER@FX8300 ~
$ echo $WD | sed -e 's/\bin\//; s/\/\//g'
C:/Users/USER/Desktop/msys/

USER@FX8300 ~
$ export W32BASE='echo $WD | sed -e 's/\bin\//; s/\/\//g''
sed: -e expression #1, char 14: unknown option to 's'

Agora eu me pergunto por que o combo echo / sed falha nos backticks enquanto funciona perfeitamente quando lançado sozinho?

    
por Y.Lin 24.11.2016 / 12:08

1 resposta

0

A substituição de comandos pode ser feita por backticks, que você está usando, ou $ ().

Da referência de bash:

When the old-style backquote form of substitution is used, backslash retains its literal meaning except when followed by ‘$’, ‘'’, or ‘\’. The first backquote not preceded by a backslash terminates the command substitution. When using the $(command) form, all characters between the parentheses make up the command; none are treated specially.

Source: https://www.gnu.org/software/bash/manual/html_node/Command-Substitution.html

No seu exemplo, você está escapando da segunda barra invertida, o que quebra seu comando (além de não corresponder a sua string).

Se você quiser continuar usando backticks, seu comando deve ser:

 W32BASE='echo $WD | sed 's/\\bin\\//g;s/\\/\//g''

Quando você usa $ (), barras invertidas são tratadas como você normalmente esperaria e seu comando seria:

 W32BASE=$(echo $WD | sed 's/\bin\//g;s/\/\//g')
    
por 24.11.2016 / 14:06

Tags