porque \ END é usado em ed [duplicado]

1

Usando ed coloque o caractere # no início das linhas 10 a 20 no arquivo /etc/passwd . A solução é a seguinte

ed /etc/passwd <<\END
10,20s/^/#/
%p
Q
END

minha pergunta é: o que significa << aqui e \ antes de END e por que a usamos? Temos que usá-lo o tempo todo ou não?

    
por Somojel 13.04.2018 / 17:11

2 respostas

4

O que você está mostrando é ed sendo usado em conjunto com um script de edição.

O script de edição (uma série de comandos ed ) está sendo passado para ed como um documento aqui. Um aqui-documento é um pedaço de texto possivelmente em várias linhas redirecionado para a entrada padrão de um utilitário. O aqui-documento é o que está entre o primeiro e o último END marcadores. O \ na frente do primeiro marcador END significa que o documento está entre aspas, o que significa que o shell não tentará expandir as variáveis, etc. Também poderia ter sido escrito como <<'END' . Nesta instância específica, o \ pode ser removido, pois o script de edição não contém nada para o shell expandir.

Esta é uma maneira comum de usar ed para edição não interativa mais simples, embora ed deva ser usado com sua opção -s ao usá-lo dessa maneira.

O comando é equivalente ao uso de sed com

sed '10,20/^/#/' /etc/passwd

(O script ed fará as alterações no arquivo e exibirá o arquivo no terminal antes de sair sem salvar as alterações, o que é mais ou menos o script acima de sed está fazendo numa linha por linha).

Não é uma boa maneira de editar o arquivo /etc/passwd (o que o script ed não está fazendo, felizmente, já que ele não salva suas alterações). Para isso, ferramentas como vipw ou comandos específicos feitos para modificar este arquivo (como useradd etc.) devem ser usados. Isso ocorre porque o arquivo, em muitos sistemas Unix, precisa estar em sincronia com um ou vários outros arquivos ou bancos de dados, e editá-lo também requer atualização (por exemplo, vipw faz automaticamente).

    
por 13.04.2018 / 17:27
0

Não é ed , é a sua concha.

Isso significa obter entrada bruta até a palavra END e enviá-la para o STDIN de um comando.

Por exemplo:

$ cat <<\END
> something
> END
something

produz o mesmo resultado que:

$ echo something | cat
something
    
por 13.04.2018 / 17:31