Как захватить ввод командной строки в файл журнала и выполнить его одновременно?

Предположим, что я выдаю несколько команд в командной строке:

#capture what follows $ echo "foo" foo # don't capture $ echo "bing" bing # capture again $ echo "bar" bar 

Как я могу выборочно регистрировать команды в файле журнала, который только захватывает сами команды, выпущенные на кли? То есть эффективно достижение чего-то похожего на .bash_history , но только для определенных команд:

 $ cat command.log echo "foo" echo "bar" 

Обратите внимание, что вывод в STDOUT каждой команды не должен регистрироваться.
Я посмотрел на перенаправление IO , но не смог найти рабочего решения.

4 Solutions collect form web for “Как захватить ввод командной строки в файл журнала и выполнить его одновременно?”

Если вы определяете функцию типа

 loglast() { fc -ln -1 | sed 's/^[[:space:]]*//' >> "${1:-${logfile:-~/command.log}}" } 

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

Используемый файл журнала (в порядке): необязательный первый аргумент для loglast или $logfile loglast , если аргумент не указан, или $HOME/command.log в качестве последнего значения по умолчанию.

Команда sed -s '/^[[:space:]]*// удаляет ведущие пробелы, которые добавляет fc .

Самый простой подход – использовать функции, уже предоставленные bash. В частности, переменная HISTIGNORE :

  HISTCONTROL A colon-separated list of values controlling how commands are saved on the history list. If the list of values includes ignorespace, lines which begin with a space character are not saved in the history list. 

Итак, вы можете сделать что-то простое

 $ HISTCONTROL=ignorespace 

Затем любые команды, которые вы вводите с ведущим пространством, будут игнорироваться:

 HISTCONTROL=ignorespace $ history -c ## clear previous history for this session $ echo foo foo $ echo bar bar $ history 1 echo foo 2 history 

Как вы можете видеть выше, команда, которая начиналась с пробела, была проигнорирована.


Вы также можете использовать HISTIGNORE :

  HISTIGNORE A colon-separated list of patterns used to decide which command lines should be saved on the history list. Each pattern is anchored at the beginning of the line and must match the com‐ plete line (no implicit `*' is appended). Each pattern is tested against the line after the checks specified by HISTCON‐ TROL are applied. In addition to the normal shell pattern matching characters, `&' matches the previous history line. `&' may be escaped using a backslash; the backslash is removed before attempting a match. The second and subsequent lines of a multi-line compound command are not tested, and are added to the history regardless of the value of HISTIGNORE. 

Если вы установите HISTIGNORE на что-то вроде #foo а затем добавьте это к командам, которые вы хотите проигнорировать, вы можете получить тот же эффект:

 $ HISTIGNORE="*#foo" $ history -c $ echo foo foo $ echo "bar" #foo bar $ history 1 echo foo 2 history 

В обоих случаях, если вы хотите сохранить это в файл, просто запустите history > file . Кроме того, установите файл истории в file для сеанса:

 $ HISTFILE="/tmp/file" $ HISTCONTROL=ignorespace $ history -c $ echo foo foo $ echo bar bar $ history -a ## write the session's history to $HISTFILE $ cat /tmp/file echo foo history -a 

Используйте команду script :

 script -f filename.log 

Он запускает новый сеанс и регистрирует все ваши команды. Когда вы выходите из файла, он закрывается.

Я мог бы подумать о команде script для регистрации команд. Но у этого есть недостаток регистрации всех, что вы получили в стандартном выпуске.

 script -a #Start your scripting session. Script started, file is typescript echo "Hello" Hello echo "Another Hello" Another Hello #Press Ctrl - D to exit the scripting session. Script done, file is typescript 

Теперь все, что вы делали в сеансе, регистрируется в файле машинописных файлов.

 cat typescript Script started on Fri 21 Nov 2014 10:12:56 AM CST echo "Hello" Hello echo "Another Hello" Another Hello Script done on Fri 21 Nov 2014 10:13:08 AM CST 

РЕДАКТИРОВАТЬ

Однако, поскольку вам нужно записывать только команды, а не выводить команды, вы можете сделать что-то, как предлагается здесь .

  1. Если у вас нет screen , установите его, используя screen установки apt-get install screen .
  2. Теперь добавьте содержимое ниже в файл ~/.screenrc (Даже если файл не существует, вы можете его создать).

     screen -t "window 0" 0 bash -ic 'HISTFILE=~/.bash_history.${WINDOW} bash' screen -t "window 1" 1 bash -ic 'HISTFILE=~/.bash_history.${WINDOW} bash' screen -t "window 2" bash -ic 'HISTFILE=~/.bash_history.${WINDOW} bash' bind c screen bash -ic 'HISTFILE=~/.bash_history.${WINDOW} bash' bind ^C screen bash -ic 'HISTFILE=~/.bash_history.${WINDOW} bash' 
  3. Теперь запустите сеанс, набрав команду на screen и выполните свои команды, как обычно.

  4. Теперь вы можете просмотреть список команд, которые вы использовали на screen , проверив файл ~/.bash_history.${WINDOW} где ${WINDOW} соответствует номеру экрана, в котором вы выполняли ваши команды.
  • Как я могу завершить работу после размонтирования USB-устройства из командной строки?
  • создание простой команды для sudo apt-get install?
  • Альтернативное решение для создания нескольких копий одного файла с помощью командной строки?
  • Как оболочка отличается от командной интерпретатор?
  • Могу ли я установить значения по умолчанию для rsync в режиме без демона?
  • Создавать несколько процессов с помощью одной команды
  • команда оболочки cd! $
  • Безопасная передача пользовательского ввода в команду
  • Как создать файл deflate, подходящий для HTTP?
  • Unix, которая сразу же возвращает код возврата?
  • Получить заголовки окон с помощью командной строки
  • Interesting Posts
    Linux и Unix - лучшая ОС в мире.