Como corrigir um arquivo (e criar patches) en Linux

Conteúdo

PC exibindo um prompt de shell em um desktop Linux

El Linux patch O comando permite que você transfira alterações de um conjunto de arquivos para outro conjunto de arquivos de forma rápida e segura. Aprenda a usar patch o jeito simples.

Os comandos patch e diff

Imagine que você tem um arquivo de texto no seu computador. Receba uma versão modificada desse arquivo de texto de outra pessoa. Como você transfere rapidamente todas as alterações do arquivo modificado para o seu arquivo original? Isso e onde patch e diff venha jogar. patch e diff encontrado no Linux e outros sistemas operacionais semelhantes ao Unix, como macOS.

a diff comando examinar duas versões diferentes de um arquivo e liste as diferenças entre eles. As diferenças podem ser armazenadas em um arquivo chamado arquivo de patch.

a patch O comando pode ler um arquivo de patch e usar o conteúdo como um conjunto de instruções. Seguindo essas instruções, mudanças no arquivo modificado são replicado no original procedimentos.

Agora imagine que este procedimento ocorre em um diretório inteiro de arquivos de texto. Tudo de uma vez. Esse é o poder de patch.

Às vezes, eles não enviam arquivos modificados para você. Tudo o que é enviado para você é o arquivo de patch. Por que enviar dezenas de arquivos quando você pode enviar um arquivo ou postar um arquivo para download fácil?

O que você faz com o arquivo de patch para realmente corrigir seus arquivos? Além de ser quase um trava-língua, também é uma boa pergunta. Iremos guiá-lo nesta postagem.

a patch O comando é usado com mais frequência por pessoas que trabalham com arquivos de código-fonte de software., mas funciona igualmente bem com qualquer conjunto de arquivos de texto, qualquer que seja o seu objetivo, código fonte ou não.

RELACIONADO: Como comparar dois arquivos de texto no terminal Linux

Nosso cenário de exemplo

Nesta fase, estamos em um diretório chamado trabalho que contém dois outros diretórios. Um é chamado trabalho, e o outro é chamado mais recente. O diretório de trabalho contém um conjunto de arquivos de código-fonte. O diretório mais recente contém a versão mais recente desses arquivos de código-fonte, alguns dos quais foram modificados.

Para ter certeza, o diretório de trabalho é uma cópia da versão atual dos arquivos de texto. Não é a única cópia deles.

Encontre as diferenças entre duas versões de um arquivo

a diff comando encontrar diferenças entre dois arquivos. Sua ação padrãoé listar as linhas modificadas na janela do terminal.

Um arquivo é chamado slang.c. Iremos comparar a versão do diretório de trabalho com a do diretório mais recente.

a -u opção (unificado) dados diff para listar ainda algumas das linhas de texto não modificadas antes e depois de cada uma das seções modificadas. Essas linhas são chamadas de linhas de contexto. Eles ajudam o patch localizar precisamente onde uma alteração deve ser feita no arquivo original.

Fornecemos os nomes dos arquivos para que diff saiba quais arquivos comparar. O arquivo original é listado primeiro, depois do arquivo modificado. Este é o comando que emitimos para diff:

diff -u working / slang.c mais recente / slang.c

diff produz uma lista de saída mostrando as diferenças entre os arquivos. Se os arquivos fossem idênticos, nenhum resultado seria incluído na lista. Vendo este tipo de resultado de diff confirma que existem diferenças entre as duas versões do arquivo e que o arquivo original precisa de um patch.

Faça um arquivo de patch

Para capturar essas diferenças em um arquivo de patch, use o seguinte comando. É o mesmo comando que o anterior, com a partida de diff redirecionado para um arquivo chamado slang.patch.

diff -u working / slang.c mais recente / slang.c > slang.patch

O nome do arquivo de patch é arbitrário. Você pode chamá-lo do que quiser. Dê a ele uma extensão “.correção” é uma boa ideia; Apesar disto, deixe claro que tipo de arquivo é.

Para fazer patch agir no arquivo de patch e modificar o arquivo de trabalho / slang.c, use o seguinte comando. a -u opção (unificado) possibilita patch saiba que o arquivo de patch contém linhas de contexto unificadas. Em outras palavras, usamos a opção -u com diff, então usamos o -u opção com patch.

parche -u working.slang.c -i slang.patch

Se tudo correr bem, há apenas uma linha de partida que diz a você patch está corrigindo o arquivo.

Faça um backup do arquivo original

Podemos instruir patch para fazer um backup dos arquivos corrigidos antes de serem modificados por meio do -b opção (copia de segurança). a -i Opção (entrada) diz ao patch o nome do arquivo de patch a ser usado:

patch -u -b working.slang.c -i slang.patch

O arquivo foi corrigido como antes, sem diferenças visíveis na saída. Apesar disto, se você olhar para a pasta de trabalho, você verá que o arquivo chamado slang.c.orig foi criado. Os carimbos de data e hora do arquivo mostram que slang.c.orig é o arquivo original e slang.c é um novo arquivo criado por patch.

Usando diff com diretórios

Podemos usar diff para criar um arquivo de patch contendo todas as diferenças entre os arquivos em dois diretórios. Então, podemos usar esse arquivo de patch com patch para que essas diferenças sejam aplicadas aos arquivos na pasta de trabalho com um único comando.

As alternativas que usaremos com diff são os -u (contexto unificado) que usamos anteriormente, a -r (recursivo) opção de fazer diff pesquisar em qualquer subdiretório e o -N (novo arquivo) opção.

a -N opção diz diff como lidar com arquivos no diretório mais recente que não estão no diretório de trabalho. Força diff coloque instruções no arquivo de patch para quepatch cria arquivos que estão presentes no diretório mais recente, mas estão faltando no diretório de trabalho.

Você pode agrupar as alternativas para usar um único script (-).

Observe que fornecemos apenas os nomes dos diretórios, não estamos dizendo diff para olhar para arquivos específicos:

diff -ruN funcionando/ mais recente/ > slang.patch

slang.patch” largura =”646″ altura =”77″ carregar =”pagespeed.lazyLoadImages.loadIfVisibleAndMaybeBeacon(isto);” umerro=”this.onerror=nulo;pagespeed.lazyLoadImages.loadIfVisibleAndMaybeBeacon(isto);”>

Dando uma olhada dentro do arquivo de patch

Vamos dar uma olhada rápida no arquivo de patch. Usaremos less para ver seu conteúdo.

A parte superior do arquivo mostra as diferenças entre as duas versões do slang.c.

Rolando para baixo no arquivo de patch, vemos que mais tarde ele descreve as mudanças em outro arquivo chamado structs.h. Isso verifica se o arquivo de patch definitivamente contém as diferenças entre as diferentes versões de vários arquivos.

Olhe antes de pular

Corrigir uma grande coleção de arquivos pode ser um pouco desconcertante, portanto, vamos usar o --dry-run opção de verificar se está tudo bem antes de dar o passo e se comprometer a fazer as alterações.

a --dry-run opção diz patch Fazer tudo, além de modificar os arquivos. patch irá realizar todas as suas verificações pré-voo em arquivos e, se você encontrar algum problema, irá informar. De qualquer forma, nenhum arquivo é modificado.

Se nenhum problema for relatado, podemos repetir o comando sem o --dry-run opção e corrigir nossos arquivos com confiança.

a -d (diretório) opção dizer patch em qual diretório trabalhar.

Por favor, note que nós somos não usando o -i (entrada) opção de contar patch qual arquivo de patch contém as instruções para diff. Em vez de, estamos redirecionando o arquivo de patch para patch com <.

patch --dry-run -ruN -d funcionando < slang.patch

De todo o diretório, diff Eu encontrei dois arquivos para corrigir. As instruções sobre modificações para esses dois arquivos foram verificadas por patch e nenhum problema foi relatado.

As verificações pré-voo estão bem; estamos prontos para decolar.

Corrigir um diretório

Para aplicar genuinamente os patches aos arquivos, usamos o comando acima sem o --dry-run opção.

patch -ruN -d funcionando < slang.patch

Desta vez, cada linha de saída não começa com “comprobación”, cada linha começa com “parcheo”.

E nenhum problema é relatado. Podemos compilar nosso código-fonte e teremos a versão mais recente do software.

Resolva suas diferenças

Esta é, com muito, a maneira mais fácil e segura de usar patch. Copie seus arquivos de destino para uma pasta e corrija essa pasta. Copie-os novamente quando estiver satisfeito com o procedimento de patch concluído sem erros.

setTimeout(função(){
!função(f,b,e,v,n,t,s)
{E se(f.fbq)Retorna;n = f.fbq = função(){n.callMethod?
n.callMethod.apply(n,argumentos):n.queue.push(argumentos)};
E se(!f._fbq)f._fbq = n;n.push = n;n.loaded =!0;n.version = ’2.0′;
n.queue =[];t = b.createElement(e);t.async =!0;
t.src = v;s = b.getElementsByTagName(e)[0];
s.parentNode.insertBefore(t,s) } (window, documento,'roteiro',
‘Https://connect.facebook.net/en_US/fbevents.js ’);
fbq('iniciar', ‘335401813750447’);
fbq('acompanhar', ‘PageView’);
},3000);

Assine a nossa newsletter

Nós não enviaremos SPAM para você. Nós odiamos isso tanto quanto você.