Como aplicar um patch a um arquivo (e criar patches) no Linux

PC mostrando um prompt de shell em um desktop Linux
Fatmawati Achmad Zaenuri / Shutterstock.com

O patchcomando Linux permite transferir as alterações de um conjunto de arquivos para outro conjunto de arquivos com rapidez e segurança. Aprenda a usar patcha maneira mais simples.

Os comandos patch e diff

Imagine que você tenha um arquivo de texto em seu computador. Você recebe uma versão modificada desse arquivo de texto de outra pessoa. Como você transfere rapidamente todas as alterações do arquivo modificado para o arquivo original? É onde patche diffentram em jogo. patche diffsão encontrados no Linux e em outros sistemas operacionais semelhantes ao Unix , como o macOS.

O diffcomando examina duas versões diferentes de um arquivo e lista as diferenças entre elas. As diferenças podem ser armazenadas em um arquivo denominado arquivo de patch.

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

Agora imagine esse processo acontecendo com um diretório inteiro de arquivos de texto. Tudo de uma vez. Esse é o poder de patch.

Às vezes, você não recebe os arquivos modificados. Tudo o que você recebe é 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 corrigir seus arquivos? Além de ser quase um trava-língua, essa também é uma boa pergunta. Orientaremos você neste artigo.

O patchcomando é mais frequentemente usado 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 sua finalidade, código-fonte ou não.

Recomendado:  Qual é a diferença entre clareza e textura no Adobe Photoshop Lightroom?

Nosso Cenário de Exemplo

Nesse cenário, estamos em um diretório chamado work, que contém dois outros diretórios. Um é chamado de trabalho e o outro é chamado de 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.

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

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

O diffcomando encontra as diferenças entre dois arquivos. Sua ação padrão é listar as linhas modificadas na janela do terminal.

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

A -u opção (unificada) informa diffpara listar também algumas das linhas de texto não modificadas de antes e depois de cada uma das seções alteradas. Essas linhas são chamadas de linhas de contexto. Eles ajudam o  patch comando a localizar precisamente onde uma alteração deve ser feita no arquivo original.

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

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

diff -u trabalhando / slang.s mais recente / slang.c em uma janela de terminal

diffproduz uma lista de saída mostrando as diferenças entre os arquivos. Se os arquivos fossem idênticos, não haveria nenhuma saída listada. Ver esse tipo de saída diffconfirma que há diferenças entre as duas versões do arquivo e que o arquivo original precisa de patch.

saída de diff em uma janela de terminal

Fazendo um arquivo de patch

Para capturar essas diferenças em um arquivo de patch, use o seguinte comando. É o mesmo comando acima, com a saída de diffredirecionada para um arquivo chamado slang.patch.

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

diff -u trabalhando / slang.c mais recente / slang.c> slang.patch em uma janela de terminal

O nome do arquivo de patch é arbitrário. Você pode chamá-lo do que quiser. Atribuir a ele uma extensão “.patch” é uma boa ideia; entretanto, já que deixa claro que tipo de arquivo é.

Recomendado:  Como bloquear reações irritantes de iMessage no Android

Para  patchagir sobre o arquivo de patch e modificar o arquivo de trabalho / slang.c, use o seguinte comando. A -uopção (unificado) permite patch saber que o arquivo de patch contém linhas de contexto unificadas. Em outras palavras, usamos a opção -u com diff, então usamos a -uopção com patch.

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

patch -u working.slang.c -i slang.patch em uma janela de terminal

Se tudo correr bem, há uma única linha de saída informando que você patchestá corrigindo o arquivo.

Fazendo um backup do arquivo original

Podemos instruir patcha fazer uma cópia de backup dos arquivos corrigidos antes de serem alterados usando a  -bopção (backup). A -iopção (entrada) informa ao patch o nome do arquivo de patch a ser usado:

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

patch -u working.slang.c -i slang.patch em uma janela de terminal

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

saída de ls em uma janela de terminal

Usando diff com diretórios

Podemos usar diffpara criar um arquivo de patch que contém todas as diferenças entre os arquivos em dois diretórios. Podemos então usar esse arquivo de patch patchpara que essas diferenças sejam aplicadas aos arquivos na pasta de trabalho com um único comando.

As opções com as quais vamos usar diffsão a opção -u(contexto unificado) que usamos anteriormente, a -ropção (recursiva) para fazer a diffpesquisa em qualquer subdiretório e a opção -N(novo arquivo).

A -Nopção informa diff como lidar com arquivos no diretório mais recente que não estão no diretório de trabalho. Ele força diffa colocar instruções no arquivo de patch para patch criar arquivos que estão presentes no diretório mais recente, mas ausentes do diretório de trabalho.

Você pode agrupar as opções para que usem um único hífen ( -).

Recomendado:  Por que você (provavelmente) não precisa de uma GPU incrivelmente poderosa como a GTX 1080 Ti

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

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

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

Espiando por dentro do arquivo de patch

Vamos dar uma olhada rápida no arquivo de patch. Usaremos lesspara examinar seu conteúdo.

menos slang.patch em uma janela de terminal

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

menos slang.patch mostrando o topo do ile em uma janela de terminal

Percorrendo ainda mais o arquivo de patch, vemos que ele descreve as alterações 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.

menos slang.patch mostrando o meio do arquivo em uma janela de terminal

Olhe antes de pular

Corrigir uma grande coleção de arquivos pode ser um pouco enervante, por isso vamos usar a --dry-run opção de verificar se está tudo bem antes de nos arriscarmos e nos comprometermos a fazer as alterações.

A --dry-runopção diz patchpara fazer tudo, exceto modificar os arquivos. patchirá realizar todas as suas verificações pré-voo nos arquivos e se encontrar algum problema, ele os relata. De qualquer forma, nenhum arquivo é modificado.

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

A -dopção (diretório) informa em patchqual diretório trabalhar.

Note que estamos não utilizar a -iopção (entrada) para dizer patchqual arquivo patch contém as instruções de diff. Em vez disso, estamos redirecionando o arquivo de patch para patchcom <.

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

patch --dry-run -ruN -d working <slang.patch em uma janela de terminal

De todo o diretório, diffencontramos dois arquivos para corrigir. As instruções relativas às modificações para esses dois arquivos foram verificadas por patch e nenhum problema foi relatado.

As verificações pré-voo estão OK; estamos prontos para a decolagem.

Patching a Directory

Para aplicar genuinamente os patches aos arquivos, usamos o comando anterior sem a --dry-runopção.

patch -ruN -d working <slang.patch

patch -ruN -d trabalhando <slang.patch em uma janela de terminal

Desta vez, cada linha de saída não começa com “verificação”, cada linha começa com “patching”.

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

Resolva suas diferenças

Esta é de longe a maneira mais fácil e segura de usar patch. Copie seus arquivos de destino para uma pasta e corrija essa pasta. Copie-os de volta quando estiver satisfeito porque o processo de patch foi concluído sem erros.