Выполнить команду, когда bash закрывается из-за тайм-аута

Я не использую gnome, но вы должны иметь возможность делать то, что хотите, смешивая инструменты xbindkeysи wmctrl. (Первый может иметь графический интерфейс xbindkey-configдля упрощения настройки ).

xbindkeysпрослушивает события клавиатуры, настроенные вами в файле ~/.xbindkeysrc, и запускает команду, когда их видит.

wmctrlобщается с соответствующими оконными менеджерами и просит их переместить, изменить размер, активировать окна, идентифицированные по идентификатору или имени.

Например, эта конфигурация должна активировать ваш emacs, когда вы набираете Alt=

"wmctrl -a emacs"
  Alt+equal

Вместо двух таких привязок вы также можете использовать xdotool getactivewindow getwindowname, чтобы найти имя текущего окна, а затем переключиться на другое окно. xdotoolтакже может активировать окна, если у вас есть проблемы с gnome и wmctrl.

1
22.10.2019, 15:42
2 ответа

Единственный вариант, который я вижу, это поместить эту команду в ваш ~/.bash_logoutфайл; этот файл выполняется, если текущая оболочка является оболочкой входа в систему, а текущая оболочка не является подоболочкой.

В исходном коде для bash, где команда считывается для оценки , он устанавливает обработчик сигналов тревоги для значенияTMOUT:

  if (interactive)
    {
      tmout_var = find_variable ("TMOUT");

      if (tmout_var && var_isset (tmout_var))
      {
        tmout_len = atoi (value_cell (tmout_var));
        if (tmout_len > 0)
        {
          old_alrm = set_signal_handler (SIGALRM, alrm_catcher);
          alarm (tmout_len);
        }
      }
    }

Этот обработчик тревог выглядит так:

static sighandler
alrm_catcher(i)
     int i;
{
  printf (_("\007timed out waiting for input: auto-logout\n"));
  fflush (stdout);
  bash_logout ();   /* run ~/.bash_logout if this is a login shell */
  jump_to_top_level (EXITPROG);
  SIGRETURN (0);
}

Функцияbash_logoutопределяется как:

void
bash_logout ()
{
  /* Run our `~/.bash_logout' file if it exists, and this is a login shell. */
  if (login_shell && sourced_logout++ == 0 && subshell_environment == 0)
    {
      maybe_execute_file ("~/.bash_logout", 1);
#ifdef SYS_BASH_LOGOUT
      maybe_execute_file (SYS_BASH_LOGOUT, 1);
#endif
    }
}
1
27.01.2020, 23:40

Решение было найдено здесь:

https://stackoverflow.com/questions/58502915/differentiate-between-exit-and-session-timeout

Используйте переменную оболочки PROMPT _COMMAND и вызовите пользовательскую функцию. В пользовательской функции вы можете проверить, истек ли тайм-аут простоя оболочки, и решить, была ли ловушка вызвана из-за тайм-аута или выхода из оболочки.

0
27.01.2020, 23:40

Теги

Похожие вопросы