И четвертый :Д
awk '1 {if (a[$1]) {a[$1] = a[$1]$2"|"} else {a[$1] = $2"|"}} END {for (i in a) { print i,gensub( /\|$/,"","1",a[i])}}' kumarjit
FileA, CREATE|MODIFY|DELETE
FileB, CREATE|MODIFY
Я нашел решение, основанное наi3
протоколе IPC . Это позволяет пользователю взаимодействовать с i3
из внешнего мира. Например, пользователь может подписаться на событие i3
(«окно изменило свой полноэкранный режим» в нашем случае )и подключить обратный вызов к этому событию (и отправить SIGCONT
наi3blocks
).
Существует несколько библиотек, написанных для разных PL (, см. 5-й раздел документации i3 IPC ), которые предоставляют пользовательский интерфейс для этого протокола. Я выбралPython
один . Вот код:
#!/usr/bin/env python3
import subprocess, os, signal
from i3ipc import Event, Connection
def on_fullscreen( i3, e ) :
"""
A callback which is called every time a window
changes its fullscreen mode
"""
try :
process = subprocess.Popen( ['pgrep', 'i3blocks'],
stdout=subprocess.PIPE,
stderr=subprocess.PIPE,
universal_newlines=True )
pid = int( process.stdout.readline().split()[0] )
os.kill( pid, signal.SIGCONT )
except :
i3.main_quit()
i3 = Connection()
i3.on( Event.WINDOW_FULLSCREEN_MODE, on_fullscreen )
i3.main()
Я поместил этот код в скрипт Python с именем i3blocks_awake.py
. Теперь все, что нам нужно сделать, это выполнять этот скрипт каждый раз при запуске i3
. Итак, из документацииi3
мы знаем, что exec_always
— это то, что нам нужно. Поэтому я поместил следующую строку в свой i3
конфигурационный файл (в самый конец):
exec_always --no-startup-id '/home/lrdprdx/.config/i3/i3block_awake.py'
Перезапускаю i3
и вуаля, все мои уведомления работают как положено.
Я думаю, что это не 100% безопасное и умное решение, но оно работает. Например, каждый раз, когда i3
перезапускается, соединение с сокетом теряется, поэтому скрипт тоже перезапускается. Если вы видите какие-то недостатки здесь, пожалуйста, скажите.