Eu imaginava que a maneira mais simples de comparar o conteúdo de dois diretórios semelhantes seria algo como
diff `ls old` `ls new`
Mas vejo por que isso não funciona; diff
está sendo entregue uma grande e longa lista de arquivos na linha de comando, em vez de dois fluxos como eu esperava. Como passo as duas saídas diretamente para o diff?
command-line
diff
Ternário
fonte
fonte
Respostas:
A substituição de comando substitui
`…`
a saída do comando na linha de comando; portanto,diff
a lista de arquivos nos dois diretórios é apresentada como argumento. O que você deseja édiff
ver dois nomes de arquivos em sua linha de comandos e ter o conteúdo desses arquivos nas listagens de diretório. É isso que a substituição de processo faz.Os argumentos para
diff
terão a aparência/dev/fd/3
e/dev/fd/4
: são descritores de arquivo correspondentes a dois pipes criados pelo bash. Quandodiff
abrir esses arquivos, ele será conectado ao lado de leitura de cada canal. O lado de gravação de cada canal está conectado aols
comando.fonte
echo <(echo) <(echo)
nunca pensei que isso poderia ser tão interessante: Dls
é que ele gerencia nomes de arquivos. A análise de sua saída é frágil (não funciona com nomes de arquivos "estranhos"). Para comparar duas listagens de diretórios, não há problema, desde que a saída seja inequívoca. Com nomes de arquivos arbitrários, isso exigiria uma opção como--quoting-style=escape
.<(…)
cria um tubo. Parece que o meld não funciona com tubos, então você não pode usá-lo<(…)
. No zsh, você pode substituir<(…)
por=(…)
e funcionará porque=(…)
coloca as saídas intermediárias em um arquivo temporário. No bash, acho que não há nenhuma sintaxe conveniente, você mesmo precisará gerenciar os arquivos temporários.Para zsh, o uso
=(command)
cria automaticamente um arquivo temporário e substitui=(command)
o caminho do próprio arquivo. Com Substituição de Comando,$(command)
é substituído pela saída do comando.Portanto, existem três opções:
$(...)
<(...)
=(...)
A subscrição do processo com sabor zsh, # 3, é muito útil e pode ser usada dessa maneira para comparar a saída de dois comandos usando uma ferramenta diff, por exemplo, Beyond Compare:
Para Além da comparação, observe que você deve usar
bcomp
o acima (em vez debcompare
), poisbcomp
inicia a comparação e aguarda a conclusão. Se você usarbcompare
, isso inicia a comparação e sai imediatamente, devido ao qual os arquivos temporários criados para armazenar a saída dos comandos desaparecem.Leia mais aqui: http://zsh.sourceforge.net/Intro/intro_7.html
Observe também o seguinte:
e o seguinte, que é a diferença entre os dois tipos de substituição de processo suportados pelo zsh (ou seja, nº 2 e nº 3):
Referência: https://unix.stackexchange.com/questions/393349/difference-between-subshells-and-process-substitution
fonte
$(...)
não é substituição de processo, é substituição de comando .<(...)
é substituição de processo. É por isso que a passagem citada não menciona$(...)
nada.Casca de peixe
Na casca do peixe, você precisa entrar no psub . Aqui está um exemplo da comparação de configurações heroku e dokku com o Beyond Compare :
fonte
meld
é a de código aberto e disponível nos repositórios Ubuntu e EPEL. meldmerge.orgCostumo usar a técnica descrita na resposta aceita:
mas acho que geralmente o uso com comandos muito mais complexos que o exemplo acima. Nesses casos, pode ser irritante criar o comando diff. Eu vim com algumas soluções que outros podem achar úteis.
Acho que 99% das vezes eu tento os comandos relevantes antes de executar o diff. Consequentemente, os comandos que eu quero diferenciar estão aí na minha história ... por que não usá-los?
Utilizo o bash Fix Command (fc) interno para executar os dois últimos comandos:
Os sinalizadores fc são:
o
-1
-1
referem-se às posições inicial e final da história, neste caso, do último comando ao último comando que produz apenas o último comando.Por fim, envolvemos isso
$()
para executar o comando em um subshell.Obviamente, isso é um pouco trabalhoso de digitar, para que possamos criar um alias:
Ou podemos criar uma função:
que suporta a especificação das linhas do histórico a serem usadas. Depois de usar os dois, acho que o alias é a versão que eu prefiro.
fonte