как запустить историю -команду через равные промежутки времени автоматически?

Я попробовал команду ниже, и она сработала нормально

for file in `find /home -type f | awk -F "/" '{print $NF}'`
do
    for dir in `find. -type d| sed "s/\.//g"| sed 's/$/\//g'`
    do
        sudo find $dir -type f -iname $file | awk '{print "ls -ltrh" " " $0}'
    done | sh | sed -n '$p'
done | awk '{print "cp -rvfp" " " $NF " " "/destinationlocationtocopy/"}' | sh
2
30.08.2021, 10:30
3 ответа

Если вы нажимаете клавишу ENTER по крайней мере один раз в день, то решение на основе PROMPT _COMMAND -может сработать для вас:

save_history_daily () {
  # if the current time is more than a day's-worth of seconds newer than
  # the modification time of $HISTFILE, then run 'history -a'

  if (( $(printf '%(%s)T' -1) - 86400 > $(stat -c %Y "$HISTFILE") ))
  then 
    history -a
  fi
}

PROMPT_COMMAND="$PROMPT_COMMAND
save_history_daily"

Это зависит от версии bash bash -4.2 -alpha или новее для функции printf %(...)T; здесь я использую аргумент -1для получения текущего времени в секундах -с -эпохи -. Если у вас более старая версия bash, вы можете заменить этот бит вызовомdate:$(date +%s). В версиях Bash, начиная с bash -5.0 -alpha, доступна переменная EPOCHSECONDS, которая была бы несколько более эффективной.

Я скопировал встроенную -новую строку PROMPT _идею назначения COMMAND из одного из ответов Жиля ; он добавляет новый вызов функции к любому существующему значению (s ), которое уже было определено.

2
31.08.2021, 13:58

Прежде всего, history— это Bash, встроенный -в команду, и он влияет на сеанс, который он запускает. Насколько я знаю, вы не можете запустить команду истории из другого сеанса, чтобы сохранить последние команды, которые еще не были сохранены.

Одним из решений может быть изменение переменной окружения PROMPT_COMMANDдля запуска history -aпри каждом вводе команды. Этот пост может вам помочь.

0
30.08.2021, 20:14

Вы не можете сохранить историю оболочек из скрипта. Во всяком случае, не напрямую.

Это в основном непроверенная идея.

Оболочка bashигнорирует сигнал QUITкак интерактивная оболочка, так и не интерактивная оболочка -.

Это означает, что может быть установлена ​​ловушка для перехвата сигнала QUIT. Это можно сделать из файла запуска оболочки для интерактивных сеансов оболочки, то есть в ~/.bashrc. Ловушка просто вызоветhistory -a:

trap 'history -a' QUIT

Затем сигнал QUITможет быть отправлен в сеанс оболочки, чтобы он сохранил свою историю. Используя pkill, вы даже можете отправить его на всеbashсеансы, которые вы сейчас запускаете :

.
pkill -QUIT -U "$LOGNAME" bash

Это можно сделать из задания cron.

Обратите внимание, что я на самом деле не проверял это в какой-либо степени, кроме как убедиться, что это выглядит как работающее. Единственная мелочь заключается в том, что ^\появляется в приглашении в оболочках, которые получают сигнал таким образом. Я также просто предполагаю , что если множество оболочек сохранят свою историю одновременно ,затем это делается разумно, чтобы избежать смешанных записей.


Лично я, вероятно, использовал бы history -aв PROMPT_COMMANDвместо:

PROMPT_COMMAND+="${PROMPT_COMMAND:+;}history -a"

или

PROMPT_COMMAND="${PROMPT_COMMAND:+$PROMPT_COMMAND;}history -a"

(Они добавляют history -aк значению PROMPT_COMMANDи ограничивают его с помощью ;, если переменная уже имеет не -пустое значение.)

Это позволит сохранить историю непосредственно перед отображением следующей подсказки. Вероятно, не будет какого-либо заметного снижения производительности при выполнении этого при каждом запросе.

0
31.08.2021, 17:29

Теги

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