Наши партнеры

UnixForum





Библиотека сайта rus-linux.net

Фундаментальные основы Linux. Часть III. Раскрытие команд командной оболочкой

Оригинал: Linux Fundamentals
Автор: Paul Cobbaut
Дата публикации: 16 октября 2014 г.
Перевод: А.Панин
Дата перевода: 13 декабря 2014 г.

Глава 14. История команд командной оболочки

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

Повторение последней выполненной команды

Для повторения последней выполненной команды в командной оболочке bash следует использовать команду !!. Данная последовательность символов носит имя bang bang (бэнг-бэнг).
paul@debian5:~/test42$ echo данная команда будет повторно исполнена > file42.txt
paul@debian5:~/test42$ !!
данная команда будет повторно исполнена > file42.txt
paul@debian5:~/test42$ 

Повторение других команд

Вы можете повторить другие команды, воспользовавшись символом !, после которого должен быть введен один или несколько начальных символов команды. В результате командная оболочка повторит последнюю команду, начинающуюся с введенных символов.
paul@debian5:~/test42$ touch file42
paul@debian5:~/test42$ cat file42
paul@debian5:~/test42$ !to
touch file42
paul@debian5:~/test42$

Команда history

Для просмотра списка исполненных ранее команд следует использовать команду history, которая позволяет вывести информацию об истории команд, выполненных в рамках данной командной оболочки (или использовать команду history n для ознакомления со списком из n последних выполненных команд).
paul@debian5:~/test$ history 10
38  mkdir test
39  cd test
40  touch file1
41  echo привет > file2
42  echo Сегодня очень холодно > winter.txt
43  ls
44  ls -l
45  cp winter.txt summer.txt
46  ls -l
47  history 10

Команда !n

При вводе символа ! с последующим вводом номера команды для повторения, командная оболочка выведет строку соответствующей команды и исполнит ее.
paul@debian5:~/test$ !43
ls
file1  file2  summer.txt  winter.txt

Сочетание клавиш Ctrl-r

Другой вариант методики осуществления поиска в истории команд заключается в использовании сочетания клавиш ctrl-r. В примере ниже я использовал сочетание клавиш ctrl-r и ввел четыре символа apti, после чего в файле истории команд командной оболочки был осуществлен поиск последней команды, содержащей последовательность из этих четырех символов.
paul@debian5:~$ 
(reverse-i-search)`apti': sudo aptitude install screen

Переменная окружения $HISTSIZE

Переменная $HISTSIZE устанавливает количество команд, которые будут сохраняться при работе в вашем текущем окружении. Большинство дистрибутивов устанавливает стандартное значение данной переменной, равное 500 или 1000.
paul@debian5:~$ echo $HISTSIZE
500
Вы можете изменить значение данной переменной на любое желаемое.
paul@debian5:~$ HISTSIZE=15000
paul@debian5:~$ echo $HISTSIZE
15000

Переменная окружения $HISTFILE

Переменная $HISTFILE указывает на файл, который содержит данные истории команд вашей командной оболочки. В командной оболочке bash стандартным значением данной переменной является путь к файлу ~/.bash_history.
paul@debian5:~$ echo $HISTFILE
/home/paul/.bash_history

Данные истории команд для сессии работы с командной оболочкой сохраняются в данном файле в момент, когда вы завершаете сессию!

При закрытии эмулятора терминала gnome-terminal с помощью мыши или команды reboot в случае работы с учетной записью пользователя root, история команд вашего терминала НЕ БУДЕТ сохранена.

Переменная окружения $HISTFILESIZE

Количество команд, сохраняемых в вашем файле истории команд, может быть установлено с помощью переменной окружения $HISTFILESIZE.
paul@debian5:~$ echo $HISTFILESIZE
15000

Предотвращение сохранения команд

Вы можете предотвратить запись команды в файл истории, использовав пробел в качестве префикса команды.
paul@debian8:~/github$ echo abc
abc
paul@debian8:~/github$  echo def
def
paul@debian8:~/github$ echo ghi
ghi
paul@debian8:~/github$ history 3
 9501  echo abc
 9502  echo ghi
 9503  history 3

Регулярные выражения (дополнительная информация)

Имеется возможность использования регулярных выражений в случае использования символа ! для повтора команд. В примере ниже перед повторным исполнением команды производится замена символа 1 на символ 2 в строке этой команды.
paul@debian5:~/test$ cat file1
paul@debian5:~/test$ !c:s/1/2
cat file2
hello
paul@debian5:~/test$

История команд оболочки Korn Shell (дополнительная информация)

Повторение команды при работе с командной оболочкой Korn Shell осуществляется похожим образом. Командная оболочка Korn Shell точно так же поддерживает команду history, но для извлечения команд из списка ранее исполненных команд в данной командной оболочке используется символ r.

В примере ниже продемонстрирована работа команды history. Обратите внимание на различие в назначении параметра команды.
$ history 17
17  clear
18  echo hoi
19  history 12
20  echo world
21  history 17
При повторении команд с использованием символа r в качестве аргумента могут быть использованы как номера команд, возвращенные командой history, так и последовательности начальных символов команд.
$ r e
echo world
world
$ cd /etc
$ r
cd /etc
$

Практическое задание: история команд командной оболочки

1. Выполните команду echo Ответом на вопросы о смысле жизни, вселенной и всем сущем является 42.

2. Повторите предыдущую команду, использовав только два символа (существуют два решения!)

3. Выведите список из 5 последних исполненных вами команд.

4. Повторно выполните длинную команду echo из вопроса 1, воспользовавшись номерами команд, которые вы получили вместе с выводом команды из вопроса 3.

5. Сколько команд может храниться в файле истории команд в рамках текущей сессии вашей командной оболочки?

6. В какой файл сохраняются команды при при завершении сессии командной оболочки?

7. Сколько команд может быть записано в файл истории команд при завершении вашей текущей сессии командной оболочки?

8. Сделайте так, чтобы ваша командная оболочка bash сохранила 5000 введенных вами впоследствии команд.

9. Откройте более одной консоли (используйте сочетание клавиш Ctrl-shift-t в эмуляторе терминала gnome-terminal) с использованием одной и той же учетной записи пользователя. Когда данные истории команд запишутся в файл истории команд?

Корректная процедура выполнения практического задания: история команд командной оболочки

1. Выполните команду echo Ответом на вопросы о смысле жизни, вселенной и всем сущем является 42.

echo Ответом на вопросы о смысле жизни, вселенной и всем сущем является 42

2. Повторите предыдущую команду, использовав только два символа (существуют два решения!)

!!
или
!e

3. Выведите список из 5 последних исполненных вами команд.

paul@ubu1010:~$ history 5
 52  ls -l
 53  ls
 54  df -h | grep sda
 55  echo  Ответом на вопросы о смысле жизни, вселенной и всем сущем является 42
 56  history 5

В вашем случае номера команд будут отличаться.

4. Повторно выполните длинную команду echo из вопроса 1, воспользовавшись номерами команд, которые вы получили вместе с выводом команды из вопроса 3.

paul@ubu1010:~$ !56

5. Сколько команд может храниться в файле истории команд в рамках текущей сессии вашей командной оболочки?

echo $HISTSIZE

6. В какой файл сохраняются команды при при завершении сессии командной оболочки?

echo $HISTFILE

7. Сколько команд может быть записано в файл истории команд при завершении вашей текущей сессии командной оболочки?

echo $HISTFILESIZE

8. Сделайте так, чтобы ваша командная оболочка bash сохранила 5000 введенных вами впоследствии команд.

HISTSIZE=5000

9. Откройте более одной консоли (используйте сочетание клавиш Ctrl-shift-t в эмуляторе терминала gnome-terminal) с использованием одной и той же учетной записи пользователя. Когда данные истории команд запишутся в файл истории команд?

В момент исполнения команды exit.


Предыдущий раздел: Оглавление Следующий раздел:
Глава 13. Встраивание и параметры командных оболочек   Глава 15. Формирование списков имен файлов на основе шаблонов