Primeira coisa: não escreva em um arquivo que você está lendo, você provavelmente acabará apagando-o. Use o recurso de edição no local ( -i
).
Em seguida, dentro de aspas duras ( '
), a substituição de variáveis não funciona, então você precisará fazer outra coisa para obter o $PATH
expandido substituído lá.
Por fim, $PATH
é muito provável que contenha /
caracteres, o que quebraria a sintaxe de substituição de sed
, portanto você precisará usar outro separador.
Supondo que seus caminhos nunca contenham ;
s, tente (depois de ter feito backup de seu arquivo atual, é claro):
sed -i 's;^PATH=.*;PATH='"$PATH"';' .bashrc
A parte da correspondência da substituição significa: corresponde uma string que começa com ( ^
) a string PATH=
e seguida por qualquer caractere ( .
) qualquer número de vezes ( *
). Ou seja ele corresponderá às linhas que começam com PATH=
completamente, mas não às linhas que têm PATH=
em algum lugar no meio. O .*
é importante porque você quer substituir a linha inteira (tente sem ela para ver o que acontece).
A cotação para obter $PATH
substituído dentro da substituição é necessária para considerar casos em que $PATH
conteria caracteres em branco.
Demo:
$ foo=bar
$ echo hello | sed -e 's/hello/$foo/'
$foo
vars não são substituídos entre aspas duras. Então você recebe um literal $foo
lá. Agora deixe o shell expandi-lo, trazendo-o para fora das citações:
$ foo=bar
$ echo hello | sed -e 's/hello/'$foo'/'
bar
Ok! Mas isso não é seguro:
$ foo="bar baz"
$ echo hello | sed -e 's/hello/'$foo'/'
sed: -e expression #1, char 11: unterminated 's' command
sed
recebeu dois argumentos após -e
acima: s/hello/bar
e baz/
, separadamente. Não é bom. Para corrigir isso, você precisa de um pouco mais de aspas:
$ foo="bar baz"
$ echo hello | sed -e 's/hello/'"$foo"'/'
bar baz
Colocar uma variável de ambiente dentro de "
quotes é algo que você deve sempre fazer quando você está passando isso como um argumento para outra coisa, caso contrário (assumindo que $IFS
não foi alterado) ele será dividido espaço em branco.