Команда истории внутри сценария bash

Я избивал себе голову, чтобы написать простой сценарий истории за последние два дня. История – это встроенная в оболочку команда, которую я не мог использовать в скрипте BASH. Итак, есть ли способ достичь этого, используя BASH-скрипт?
Здесь мы отправляем мой сценарий для вас:

#!/bin/bash history | tail -100 > /tmp/history.log cd /tmp uuencode history.log history.txt | mail -s "History log of server" hello@hel.com 

7 Solutions collect form web for “Команда истории внутри сценария bash”

По умолчанию Bash отключает историю в неинтерактивных оболочках, но вы можете включить ее.

 #!/bin/bash HISTFILE=~/.bash_history set -o history history | tail … 

Но если вы пытаетесь контролировать активность на этом сервере, история оболочки бесполезна (тривиально запускать команды, которые не отображаются в истории). Смотрите, как я могу регистрировать все запуски процессов в Linux .

Я не уверен, действительно ли он использует возможности истории при работе в неинтерактивном режиме, в противном случае каждый запущенный вами сценарий оболочки загромождает вашу историю команд.

Почему бы не перейти непосредственно к источнику ${HOME}/.bash_history , заменить history | tail -100 history | tail -100 с tail -100 ${HOME}/.bash_history . (Если вы используете временные метки, вам, вероятно, придется что-то делать по строкам grep -v ^# ${HOME}/.bash_history | tail -100 ).

Встроенная история, похоже, отключена внутри сценария оболочки. См. Здесь: http://www.tldp.org/LDP/abs/html/histcommands.html

Я не нашел официальной документации об этом.

Создайте скрипт с именем script.sh как script.sh ниже. Он создает скрипт с именем X и помещает в него Y строк строки вашей истории.

 #!/bin/bash SCRIPT_NAME=$1 NUMBER_OF_LINES_BACK=$2 # Enable History in a non interactive shell HISTFILE=~/.bash_history set -o history # echo shabang line and x number of lines of history to new script echo \#\!\/bin\/bash > $SCRIPT_NAME.sh; history | tail -n $NUMBER_OF_LINES_BACK >> $SCRIPT_NAME.sh; chmod u+x $SCRIPT_NAME.sh; # Open the newly created script with vim vim $SCRIPT_NAME.sh; ~ 

Затем, если вы хотите создать скрипт для выполнения задачи с именем «задача», над которой вы работали, за последние 14 строк

 script.sh task 14 

Затем очистите свою историю, чтобы создать хороший скрипт!

Каждый пользователь имеет собственный файл истории, который является результатом команды history. Вместо использования команды history в вашем сценарии оболочки вы можете использовать файл истории для пользователя. В домашнем каталоге пользователя будет файл .bash_history , который будет файлом истории для пользователя.

Если вы хотите использовать вывод команды history из активного сеанса оболочки в скрипте, вы можете использовать псевдоним для запуска команды в первую очередь. Затем в том же псевдониме вы можете вызвать оставшуюся часть скрипта. При такой конфигурации вы можете добиться практически того же результата, что и команда history в реальном скрипте.

Например, вы можете создать подобный псевдоним, предполагая, что имя скрипта – script.sh:

 alias hy_tmp='history | tail -100 > /tmp/history.log ; bash /patch/to/script.sh' 

И измените сценарий на это:

 #!/bin/bash cd /tmp uuencode history.log history.txt | mail -s "History log of server" hello@hel.com 

Я нашел этот вопрос во время написания процесса для объединения, сортировки и синхронизации файлов ~/bash_history на двух компьютерах, поэтому будет легко искать команды, которые я использовал в прошлом.

Это гораздо меньше хлопот, чтобы обновить мой накопительный файл истории без необходимости входить в новую оболочку, чтобы обновить ~/bash_history . Для мониторинга сервера это, очевидно, не будет работать, как упоминалось в других ответах.

Мое использование в частности:

 alias hbye='history | cut -c 8- > /home/chris/.bash_history_c; bash /hby.sh 

Сценарий hby.sh затем извлекает все уникальные записи из всех файлов ~/.bash_history* .

Краткий ответ :

используйте history -p чтобы явно расширять историю.

Приведем пример.

Один случай использования для меня много:

  • предыдущая команда получает список имен файлов и печатает на stdout,
  • Мне нужно отредактировать файл с помощью vim.

Поскольку мой bash был set -o histexpand , обычно то, что я делал, это печатать

 vim $(!!) 

для редактирования файлов, перечисленных в предыдущей команде.

К сожалению, иногда случается ошибка, поэтому я могу подтвердить проверку с помощью shopt -s histverify .

Теперь я могу проверить расширение, стоимость одного дополнительного ключа возврата .

Сегодня я хочу обернуть эти детали в функцию bash, так как я использую их много,

 function vk() { set -o history && set -o histexpand; vim -i ~/.viminfok $($(history -p !!)); } 

Здесь я использую две вложенные command substitution , внутреннюю для расширения !! к предыдущей команде, внешняя – для ее выполнения и получения результата.

Теперь я могу добиться такого же эффекта, имея только три ключа, и один из них – Return !

  • Точная разница между данными строк в двух файлах в Linux
  • Преобразование GB в TB в скрипт
  • как проверить, используется ли таблица mysql или приложение обращается к таблице в сценарии оболочки?
  • Как сделать ключ переключения с помощью Autokey?
  • Тест веб-камеры Debian / Raspberry usb перед выпуском скрипта fswebcam, множественный сбой приведет к сбою ОС
  • Как я могу автоматически войти в список серверов, чтобы предотвратить блокировку учетной записи?
  • Горячая клавиша LXDE для запуска приложения или переключения на него, если он уже запущен
  • SSH для входа в систему с помощью pam_exec.so
  • В чем разница между ./script и. ./script?
  • Оценка find (-exec)
  • Переименовать файлы в индекс
  • Linux и Unix - лучшая ОС в мире.