«History» перестает работать при запуске внутри сценария bash

Я пишу простой скрипт для grep моей истории bash, чтобы найти определенную строку. В командной строке я могу сделать следующее, которое отлично работает:

history | grep git 

Однако, когда я создаю скрипт bash с той же командой, что и выше, внезапно history ничего не возвращает:

 #!/bin/bash history | grep git 

Когда я удаляю первую строку #!/bin/bash , мой скрипт работает снова. Что здесь происходит? Как я могу использовать history внутри сценария bash?

2 Solutions collect form web for “«History» перестает работать при запуске внутри сценария bash”

Ниже приведены только для bash 4.0 or higher only , но это трюк. 🙂

 #!/bin/bash -i history | grep sometext 

Работает! Попробуйте. ( -i = i nteractive, флаг недоступен для bash 3.x и ранее)

Когда вы запускаете сценарий оболочки bash, например, запустив исполняемый файл, чья строка shebang равна #!/bin/bash , скрипт запускается в неинтерактивной оболочке. Одной из особенностей неинтерактивной оболочки является то, что история отключена. Поэтому, если вы хотите, чтобы ваш скрипт мог использовать историю, вам нужно сделать что-то вроде этого:

 #!/bin/bash HISTFILE=~/.bash_history # Or wherever you bash history file lives set -o history # enable history history | grep git 

Конечно, в этом случае вы могли бы просто сделать:

 grep git ~/.bash_history 

Поскольку оба вышеуказанного требуют обновления файла истории ( ~/.bash_history ), чего почти наверняка не будет.

Я не уверен, как вы запускаете свой скрипт после удаления строки shebang. Поиск файла (например, с . ) Не совпадает с запуском скрипта, потому что команды запускаются в текущей оболочке, которая имеет историю.

  • Сценарий, который удаляет нежелательные символы из переменной
  • Условная установка файлов и каталогов в пакетах Debian
  • замените '_' на ',' в файле, который содержит список имен файлов
  • переменная интерполяция в сценарии оболочки
  • Возможно ли создать липкое перенаправление из stdout / stderr
  • Выполнить команду перед выключением
  • Команда одиночной строки для протоколирования IP-адресов
  • Как я могу безопасно получить версию ksh?
  • Как передать аргумент из сценария bash в 'x-terminal-emulator -e bash -c'?
  • Как я могу объединить переменную оболочки с другими другими параметрами в моих командных строках?
  • Как мне запустить команду в другом tty?
  • Linux и Unix - лучшая ОС в мире.