При использовании командной строки Linux часто, эффективно используя историю может быть важным стимулом производительности. На самом деле, как только вы освоите 15 примеров, которые мы предоставили здесь, вы найдете применение командной строки более приятным и увлекательным.
Как правило, когда вы вводите историю из командной строки, он выводит команду # и команду. Для аудита целей, это может быть полезно для отображения timepstamp вместе с командой, как показано ниже.
# export HISTTIMEFORMAT='%F %T ' # history | more 1 2017-03-19 11:14:15 service network restart 2 2017-03-19 11:14:15 exit 3 2017-03-19 11:14:15 id 4 2017-03-19 11:14:15 cat /etc/redhat-release
Мы твердо верим, что это может быть наиболее часто используемая функция истории. Когда вы уже выполнили очень длинную команду, вы можете просто посмотреть историю поиска, используя ключевое слово и повторно выполнить ту же команду, без необходимости полностью вводить ее снова. Нажмите Control + R и введите ключевое слово. В следующем примере, мы искали red, которая отображалась в предыдущей команде “cat /etc/redhat-release” в истории, которая содержала слово red.
# [Press Ctrl+R from the command prompt, which will display the reverse-i-search prompt] (reverse-i-search)`red': cat /etc/redhat-release [Note: Press enter when you see your command, which will execute the command from the history] # cat /etc/redhat-release Fedora release 9 (Sulphur)
Иногда вы хотите отредактировать команду из истории перед ее выполнением. Для примера, вы можете искать httpd, которая будет отображать service httpd stop из истории команд, выберите эту команду и измените остановку на запуск и заново запустить ее снова, как показано ниже.
# [Press Ctrl+R from the command prompt, which will display the reverse-i-search prompt] (reverse-i-search)`httpd': service httpd stop [Note: Press either left arrow or right arrow key when you see your command, which will display the command for you to edit, before executing it] # service httpd start
Когда-нибудь вы можете в конечном итоге повторять предыдущие команды по разным причинам. Ниже приведены 4 различных способа повторить последнюю выполненную команду.
В следующем примере, если вы хотите повторить команду #4, вы можете сделать так: !4, как показано ниже.
# history | more 1 service network restart 2 exit 3 id 4 cat /etc/redhat-release # !4 cat /etc/redhat-release Fedora release 23
Тип ! за которым следуют несколько букв команды, которые вы хотели бы повторно выполнить. В следующем примере, набрав !ps и клавишу ввода, выполнив предыдущую команду, начиная с ‘ps aux | grep yp’.
# !ps ps aux | grep yp root 16127 0.0 0.1 36236 1264 ? Sl 13:10 0:00 ypbind root 17563 0.0 0.0 4454 740 pts/0 S+ 19:19 0:00 grep yp
Добавьте следующие две строки в .bash_profile и войти снова к оболочку Bash, чтобы увидеть изменения. В этом примере только 450 команд будет сохранены в истории Bash.
# vi ~/.bash_profile HISTSIZE=450 HISTFILESIZE=450
По умолчанию, история хранится в файле ~/.bash_history. Добавьте следующую строку в файл .bash_profile и повторный вход в оболочку Bash, чтобы сохранить команду в файле истории .commandline_destroyer вместо файла .bash_history. Мы до сих пор выясняем практическое применение для этого. Мы можем видеть это, чтобы привыкнуть, если вы хотите отслеживать команды, выполняемые из различных терминалов, используя другое имя файла хронологии.
# vi ~/.bash_profile HISTFILE=/root/.commandline_destroyer
Если у вас есть хороший повод изменить имя файла истории, пожалуйста, поделитесь с нами, так как нам интересно узнать, как вы используете эту функцию.
В следующем примере pwd было напечатано три раза, когда вы делаете историю, вы можете увидеть все 3 непрерывные вхождения его. Для устранения дубликатов, установите HISTCONTROL к ignoredups, как показано ниже.
# pwd # pwd # pwd # history | tail -4 44 pwd 45 pwd 46 pwd [Note that there are three pwd commands in history, after executing pwd 3 times as shown above] 47 history | tail -4 # export HISTCONTROL=ignoredups # pwd # pwd # pwd # history | tail -3 56 export HISTCONTROL=ignoredups 57 pwd [Note that there is only one pwd command in the history, even after executing pwd 3 times as shown above] 58 history | tail -4
В ignoredups показанные выше, удаляет дубликаты, только если они являются последовательными командами. Для устранения дубликатов через всю историю, установите HISTCONTROL к erasedups, как показано ниже.
# export HISTCONTROL=erasedups # pwd # service httpd stop # history | tail -3 38 pwd 39 service httpd stop 40 history | tail -3 # ls -ltr # service httpd stop # history | tail -6 35 export HISTCONTROL=erasedups 36 pwd 37 history | tail -3 38 ls -ltr 39 service httpd stop [Note that the previous service httpd stop after pwd got erased] 40 history | tail -6
При выполнении команды, вы можете указать историю игнорированных команд, установив HISTCONTROL в ignorespace и введите пробел перед командой, как показано ниже. Я вижу много начинающих сисадминов волнуются по этому поводу, так как они могут скрыть команду из истории. Это хорошо, чтобы понять, как работает ignorespace. Но, как лучшая практика, не скрывают целенаправленно ничего из истории.
# export HISTCONTROL=ignorespace # ls -ltr # pwd # service httpd stop [Note that there is a space at the beginning of service, to ignore this command from history] # history | tail -3 67 ls -ltr 68 pwd 69 history | tail -3
Когда-нибудь вы можете очистить всю предыдущую историю, но хотите сохранить историю.
# history -c
При поиске через историю, вы можете выполнить другую команду, но использовать один и тот же параметр из команды, которую вы только что искали.
В приведенном ниже примере !!: $ рядом с командой vi получает аргумент из предыдущей команды к текущей команде.
# ls andreyex-ks.cfg andreyex-ks.cfg # vi !!:$ vi andreyex-ks.cfg
В приведенном ниже примере !^ рядом с командой vi получаем первый аргумент предыдущей команды (т.е. команды cp) к текущей команде (т.е. команде vi).
# cp andreyex-ks.cfg andreyex-ks.cfg.bak andreyex-ks.cfg # vi !^ vi andreyex-ks.cfg
В приведенном ниже примере, !cp:2 выполняет поиск предыдущей команды в истории, которая начинается с cp и принимает второй аргумент cp и его заменяет на -l команды ls, как показано ниже.
# cp ~/longname.txt /really/a/very/long/path/long-filename.txt # ls -l !cp:2 ls -l /really/a/very/long/path/long-filename.txt
В приведенном ниже примере, !cp:$ ищет предыдущую команду в истории, которая начинается с cp и принимает последний аргумент (в данном случае, который также является вторым аргументом, как показано выше) cp и заменяет его в команде Ls -l, как показано ниже.
# ls -l !cp:$ ls -l /really/a/very/long/path/long-filename.txt
Если вы хотите отключить историю все вместе и не хотите, чтобы оболочка Bash запоминала команды, которые вы набрали, установите HISTSIZE в 0, как показано ниже.
# export HISTSIZE=0 # history # [Note that history did not display anything]
Иногда вы не можете загромождать свою историю с базовыми командами, такими как pwd и ls. Используйте HISTIGNORE, чтобы указать все команды, которые вы хотите игнорировать из истории. Обратите внимание, что добавление ls к HISTIGNORE игнорирует только ls а не LS -l. Таким образом, вы должны предоставить точную команду, которую вы хотели бы игнорировать из истории.
# export HISTIGNORE="pwd:ls:ls -ltr:" # pwd # ls # ls -ltr # service httpd stop # history | tail -3 79 export HISTIGNORE="pwd:ls:ls -ltr:" 80 service httpd stop 81 history [Note that history did not record pwd, ls and ls -ltr]