atualiza a variável PATH em .bashrc usando sed

2

Eu tenho tentado atualizar minha variável PATH permanentemente colocando-a no meu arquivo .bashrc. No entanto, não quero apenas anexá-lo ao arquivo, mas substituir o PATH atual = ........ pela variável PATH que tenho para a sessão. Aqui está o que eu tenho até agora:

sed 's/^PATH=.*/${PATH=$PATH}/' .bashrc > .bashrc

Este é um hodpodge de comandos que eu vi na web, e quando eu executo isso, a linha PATH .bashrc é sobrescrita com nada. Eu apreciaria uma solução usando sed, porque eu quero adicionar ao conhecimento de sed que eu ganhei na última hora, ao invés de abadoning meus esforços para awk ou outra coisa.

    
por Zchpyvr 02.09.2012 / 17:47

1 resposta

4

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.

    
por 02.09.2012 / 18:04

Tags