zsh ssh autocomplete Host вместо имени хоста из ~/.ssh/hosts

Вы можете создать цикл, который проверяет текущее время и пропускает события, идентичные (или, в более общем смысле, похожие способом, который вы можете определить )для предыдущего события. В bash, ksh или zsh следующий простой цикл пропускает повторяющиеся события в течение 10 -секунд:

inotifywait -m … | {
  previous_SECONDS=0
  previous_event=
  while IFS= read -r event; do
    if [[ "$event" = "$previous_event" && $SECONDS <= $previous_SECONDS + 10 ]]; then
      continue
    fi
    previous_SECONDS=$SECONDS previous_event=$event
    "$post_upload" "$event"
  done
}

Оболочки не подходят для высокопроизводительной -обработки текста, поэтому, возможно, лучше использовать другой инструмент. Вы можете использовать awk, который по историческим причинам имеет очень странный способ выставить время (как количество секунд, прошедших с тех пор, как эпоха ):вызов srand()возвращает время предыдущего вызова srand().

inotifywait -m … | awk '
    {srand(); current_time = srand()}
    $0 == previous_event && current_time <= previous_time + 10 {
        system(ENVIRON["post_upload"])
    }
    {previous_event = $0; previous_time = current_time}
'

Если вам действительно не нужна переносимость, я бы отказался от этого и использовал более продвинутый язык сценариев, такой как Perl, Python или Ruby. Эти языки имеют интерфейс для inotify, поэтому нет необходимости вызывать inotifywaitи выполнять какой-либо анализ текста.

1
13.11.2019, 13:05
1 ответ

Изменение моего zstyleна следующее сработало отлично:

zstyle ':completion:*:(ssh|scp|ftp|sftp):*' hosts $hosts
zstyle ':completion:*:(ssh|scp|ftp|sftp):*' users $users
0
27.01.2020, 23:57

Теги

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