Estou tentando monitorar alterações de tema usando este comando:
dbus-monitor --session "interface='org.freedesktop.portal.Settings', member=SettingChanged" | grep -o "uint32 ."
. A saída agora se parece com isso:
uint32 0
uint32 0
uint32 1
uint32 1
uint32 0
uint32 0
uint32 1
uint32 1
Esta saída vem da alternância de temas. A notificação do tema aparece duas vezes por algum motivo. Agora eu quero canalizá-lo uniq
para que eu permaneça apenas com uma única entrada assim:
uint32 0
uint32 1
uint32 0
uint32 1
No entanto, anexar uniq
no final não produz mais nenhuma saída.
dbus-monitor --session "interface='org.freedesktop.portal.Settings', member=SettingChanged" | grep -o "uint32 ." | uniq
De man uniq
:
Filtre linhas correspondentes adjacentes de INPUT (ou entrada padrão), gravando em OUTPUT (ou saída padrão).
uniq
precisa armazenar em buffer pelo menos a última linha de saída para poder detectar linhas adjacentes, não vejo nenhuma razão para que ele não possa armazená-lo e passá-lo ao longo do pipeline. Eu tentei ajustar o buffer de linha conforme sugerido aqui , mas os resultados ainda são os mesmos para mim.
dbus-monitor --session "interface='org.freedesktop.portal.Settings', member=SettingChanged" | grep -o "uint32 ." | stdbuf -oL -i0 uniq
É o comportamento usual de muitas ferramentas (possivelmente porque esse comportamento é realmente construído em uma biblioteca compartilhada): quando eles detectam que a saída é um terminal, eles usam o modo de buffer de linha. Quando eles detectam que a saída não é um terminal, eles armazenam mais, para melhorar a taxa de transferência.
Aqui o comando relevante não é
uniq
, masgrep
porque sua saída muda de terminal para não terminal. O GNUgrep
tem uma opção para alterar esse comportamento:--line-buffered
:Se o comando não tiver uma opção específica para escolher o comportamento, ainda pode-se usar o comando
stdbuf
que altera o comportamento por meioLD_PRELOAD
do mecanismo. Para restaurar o comportamento de um comando que não está no final dos pipelines, pode-se prefixar esse comando comstdbuf -oL
.Então, para o caso do OP:
ou se este
grep
comando também não tivesse uma opção específica:Observe que, em ambos os casos,
uniq
estar no final dos pipelines não requer nenhum ajuste em seu comportamento padrão.Se mais tarde os dutos fossem aumentados e
uniq
não estivessem mais no final e, portanto, não tivessem mais saída para um terminal, isso também seria afetado e exigiria o mesmo tratamento. Por exemplo, a mudança de comportamento de:ao comportamento de:
pode ser revertido com: