Bourne Again Shell: советы и трюки

Навигация осуществляется клавишами      и   

Горячие клавиши

Навигация

Ctrl + A
перейти в начало строки
Ctrl + E
перейти в конец строки
Ctrl + B
перемещает курсор на один символ назад
Ctrl + F
перемещает курсор на один символ вперед
Alt + B
перемещает курсор назад на одно слово
Alt + F
перемещает курсор вперёд на одно слово
Ctrl + P
стрелка вверх
Ctrl + N
стрелка вниз

Действия над символами

Ctrl + W
удалить слово перед курсором
Alt + D
удалить слово после курсора
Ctrl + U
удалить всю строку слева от курсора
Ctrl + K
удалить всю строку справа от курсора
Ctrl + D
удалить текущий символ
Ctrl + H
удалить предыдущий символ
Ctrl + Y
вставить строку (слово, символ), удаленную через
Ctrl+U
/
Ctrl+W
/
Ctrl+D
/ etc
Alt + BackSpace
удалить слово в строке до разделителя
Alt + Shift + 3
добавить в начало строки # (like a комментарий)

Горячие клавиши

SIGINT / SIGTSTP / EOF

Ctrl + C
посылает сигнал SIGINT текущему процессу (аналог
kill -2 $PID
)
Ctrl + \
посылает SIGQUIT активной группе процессов
Ctrl + Z
посылает сигнал SIGTSTP текущему процессу, приостанавливая его выполнение
Ctrl + D
посылает маркер EOF (аналог
exit
или
logout
), если в строке нет символов

Разное

Ctrl + L
то же самое, что и
clear
, но быстрее
Ctrl + R
интеллектуальный поиск по истории команд
Ctrl + G
выход из поиска
Ctrl + O
ввод без очистки строки
Ctrl + X + E
открывает текстовый редактор из
$EDITOR
для редактирования всей строки
Ctrl + X + V
текущая версия bash (аналог
bash --version
)

Горячие клавиши (double-tab)

Системные пользователи

$ ~[TAB][TAB]
~avahi/          ~man/            ~pulse
~avahi-autoipd/  ~messagebus/     ~root/
~bin/            ~mpd/            ~rtkit/
~daemon/         ~mysql/          ~scard/
~dnsmasq/        ~news/           ~sshd/
~fstpk/          ~nm-openconnect  ~statd/
~ftp/            ~nobody/         ~svn/
~games/          ~nscd/           ~tftp/
~kdm/            ~ntp/            ~usbmux
~lp/             ~polkitd/        ~uucp/
~mail/           ~postfix/        ~wwwrun/

Системные переменные

$ $[TAB][TAB]
Display all 141 possibilities? (y or n)
$_                                    $__git_porcelain_commands             $MANPATH
$ALSA_CONFIG_PATH                     $__git_printf_supports_v              $MINICOM
$AUDIODRIVER                          $__git_push_recurse_submodules        $MORE
$_backup_glob                         $__git_send_email_confirm_options     $NNTPSERVER
$BASH                                 $__git_send_email_suppresscc_options  $OLDPWD
$BASH_ALIASES                         $__git_whitespacelist                 $OPTERR
$BASH_ARGC                            $GPG_TTY                              $OPTIND
$BASH_ARGV                            $GROUPS                               $OSTYPE
$BASH_CMDS                            $__grub_script_check_program          $PAGER
$BASH_COMMAND                         $HISTCMD                              $PATH
$BASH_COMPLETION_COMPAT_DIR           $HISTCONTROL                          $PIPESTATUS
$BASH_LINENO                          $HISTFILE                             $PPID
$BASHOPTS                             $HISTFILESIZE                         $PROFILEREAD
$BASHPID                              $HISTSIZE                             $PS1
$BASH_REMATCH                         $HOME                                 $PS2
$BASH_SOURCE                          $_HOMEBASHRC                          $PS4
$BASH_SUBSHELL                        $HOST                                 $PWD
$BASH_VERSINFO                        $HOSTNAME                             $PYTHONSTARTUP
$BASH_VERSION                         $HOSTTYPE                             $QEMU_AUDIO_DRV
$COLUMNS                              $INPUTRC                              $RANDOM
$COMP_WORDBREAKS                      $INSTALL_DESKTOP_EXTENSIONS           $s
$CONSOLE_MAGIC                        $japanese_legacy_encoding             $SECONDS
$COUNT                                $JAVA_BINDIR                          $SHELL
$CPU                                  $JAVA_HOME                            $SHELLOPTS
--More--  
$ echo $JAVA_HOME
/usr/lib/jvm/java

«Быстрые» операции над файлами

Пустые файлы

Для создания пустых файлов есть несколько способов, кроме
echo "" > file
или
touch file
Самый быстрый:
>file

Быстрая смена директорий

Возврат в предыдущую директорию через
cd -
/usr/share $ cd zabbix/js/jquery/
/usr/share/zabbix/js/jquery $ ls -1
jquery.js
jquery-ui.js

/usr/share/zabbix/js/jquery $ cd -
/usr/share $
Смена директории после создания
/tmp $ mkdir dir && cd $_
/tmp/dir $

Копирование / переименование по маске

Допустим, нам необходимо сделать бэкап файла. Для этого нам потребуется немного магии:
$ cp /path/to/file.txt{,.backup}

$ ls -1 /path/to/file.*
/path/to/file.txt
/path/to/file.txt.backup
Аналогично работает и для
mv
:
$ mv /path/to/file.{txt,log}
/path/to/file.log

«Быстрые» операции над файлами

Множественное создание директорий

От ручного создания тысяч вложенных директорий нас спасет флаг
-p
:
$ mkdir -p src/{master,testing}/{java,resources,pub}

$ ls -1R src/
src/master/java
src/master/resources
src/master/pub
src/testing/java
src/testing/resources
src/testing/pub
Или
$ mkdir -p src/master/java/pub

$ ls -R src/
src/:
master

src/master:
java

src/master/java:
pub

src/master/java/pub:

Закладки для текущей директории:

Создать директорию
$HOME/.jmp/
, и вставить следующий код в конец
$HOME/.profile
:
function jmp { cd -P "$JMP_PATH/$1" 2>/dev/null || echo Not found; }
function setjmp { ln -s "`pwd`" "$JMP_PATH/$1"; }
function deljmp { rm -i "$JMP_PATH/$1"; }
export JMP_PATH="$HOME/.jmp"

Использование:

setjmp thisPlace
создает закладку thisPlace
deljmp thisPlace
удаляет закладку thisPlace
jmp thisPlace
перейдет в директорию thisPlace
Работает как
pushd / popd
, но сохраняет список директорий.

Информация о процессах

Процессы в виде дерева

$ pstree

systemd─┬─agetty
        ├─avahi-daemon
        ├─bluedevil-monol
        ├─bluetoothd
        ├─cron
        ├─2*[dbus-daemon]
        ├─dbus-launch
        ├─dropbox───31*[{dropbox}]
        ├─gvfsd───{gvfsd}
        ├─gvfsd-fuse───4*[{gvfsd-fuse}]
        ├─kactivitymanage───5*[{kactivitymanage}]
        ├─kded4───5*[{kded4}]
        ├─kdm─┬─Xorg───4*[{Xorg}]
        │     └─kdm───startkde─┬─gpg-agent
        │                      └─ssh-agent
        ├─kglobalaccel
        ├─kmix───2*[{kmix}]
        ├─knotify4───{knotify4}
        ├─2*[plasma-desktop─┬─ksysguardd]
        │                   └─3*[{plasma-desktop}]]
        ├─rsyslogd───4*[{rsyslogd}]
        ├─sshd───sshd───sshd───bash───pstree
        ├─start_kdeinit
        ├─systemd-journal
        ├─systemd-logind
        ├─systemd-udevd
        ├─wpa_supplicant
        └─yakuake─┬─2*[bash]
                  └─{yakuake}

Информация о процессах

Сортировка процессов

По использованию памяти:

$ ps aux | sort -nk +4 | head -n 9

user  1037  0.0  0.0   5116  1556 ?        Ss   окт01   0:00 /usr/lib/systemd/systemd --user
user  1039  0.0  0.0   4844  1300 ?        Ss   окт01   0:00 /bin/sh /usr/bin/startkde
user  1260  0.0  0.1   5000  2544 ?        Ss   окт01   0:05 /bin/dbus-daemon
user  1261  0.0  0.0   4804    52 ?        Ss   окт01   0:06 /usr/bin/gpg-agent --sh --daemon 
user  1262  0.0  0.0   4184    28 ?        Ss   окт01   0:00 /usr/bin/ssh-agent /etc/X11/xinit/xinitrc
user  1301  0.0  0.2 128664  5500 ?        Ss   окт01   0:00 kdeinit4: kdeinit4 Running...
user  1303  0.0  0.4 132856  9840 ?        S    окт01   0:01 kdeinit4: klauncher [kdeinit] --fd=9
user  1420  0.0  0.4 149088  9476 ?        S    окт01   0:02 kdeinit4: kglobalaccel [kdeinit]

Как аналог
top
(по PID и RSS):

 $ ps -eo rss,vsz,pid,cputime,cmd --width 100 --sort pid,rss

  RSS    VSZ   PID     TIME CMD
 3232   6096     1 00:00:03 /sbin/init
...
 2124   6312   616 00:00:07 /usr/sbin/wpa_supplicant -c /etc/wpa_supplicant/wpa_supplicant.conf -u -
 2428   4788   626 00:00:52 /bin/dbus-daemon --system --address=systemd: --nofork --nopidfile --syst
 1952   4008   638 00:00:01 /usr/lib/systemd/systemd-logind
 1092  40612   648 00:00:00 /usr/sbin/rsyslogd -n
 1120   4212   713 00:00:00 /usr/bin/kdm
52816 143400   740 01:35:16 /usr/bin/Xorg -br :0 vt7 -nolisten tcp -seat seat0 -auth /var/lib/kdm/Au
 2144   7444   777 00:00:00 /usr/sbin/sshd -D
 1504   4512   983 00:00:00 /usr/sbin/cron -n
 2320   4844 19906 00:00:00 ps -eo rss,vsz,pid,cputime,cmd --width 100 --sort pid,rss
 1280   6776 30031 00:00:00 /bin/bash

Информация о процессах

Файлы, используемые процессом

$ lsof -p $PID

COMMAND   PID     USER   FD   TYPE DEVICE SIZE/OFF    NODE NAME
bash    30031 user  cwd    DIR    8,2     4096 2359297 /home/user
bash    30031 user  txt    REG    8,1   763129  664601 /bin/bash
bash    30031 user  mem    REG   0,17   217032     984 /var/run/nscd/passwd
bash    30031 user  mem    REG    8,1   256356  131076 /usr/lib/locale/ru_RU.utf8/LC_CTYPE
bash    30031 user  mem    REG    8,1  1243770  131219 /usr/lib/locale/ru_RU.utf8/LC_COLLATE
bash    30031 user  mem    REG    8,1  1978006 1049555 /lib/libc-2.18.so
bash    30031 user  mem    REG    8,1    17288 1049569 /lib/libdl-2.18.so
bash    30031 user  mem    REG    8,1   164664 1049678 /lib/libtinfo.so.5.9
bash    30031 user  mem    REG    8,1   302447 1049663 /lib/libreadline.so.6.3
bash    30031 user  mem    REG    8,1     9155 1316978 /usr/share/locale/ru/LC_MESSAGES/bash.mo
bash    30031 user  mem    REG    8,1       54  131336 /usr/lib/locale/ru_RU.utf8/LC_NUMERIC
bash    30031 user  mem    REG    8,1     2498  136056 /usr/lib/locale/ru_RU.utf8/LC_TIME
bash    30031 user  mem    REG    8,1      302  136055 /usr/lib/locale/ru_RU.utf8/LC_MONETARY
bash    30031 user  mem    REG    8,1       60  131644 /usr/lib/locale/ru_RU.utf8/LC_MESSAGES
bash    30031 user  mem    REG    8,1       34  131119 /usr/lib/locale/ru_RU.utf8/LC_PAPER
bash    30031 user  mem    REG    8,1       62  131082 /usr/lib/locale/ru_RU.utf8/LC_NAME
bash    30031 user  mem    REG    8,1      127  131361 /usr/lib/locale/ru_RU.utf8/LC_ADDRESS
bash    30031 user  mem    REG    8,1       52  131363 /usr/lib/locale/ru_RU.utf8/LC_TELEPHONE
bash    30031 user  mem    REG    8,1       23  131077 /usr/lib/locale/ru_RU.utf8/LC_MEASUREMENT
bash    30031 user  mem    REG    8,1      343  133803 /usr/lib/locale/ru_RU.utf8/LC_IDENTIFICATION
bash    30031 user  255u   CHR  136,2      0t0       5 /dev/pts/2

Процессы, использующие директорию

$ fuser -c /home/user

/home:  1039c     1301cm    1303cm    1305cm    1420cm    1433cm
1485c   1486cm    1490cm    1493cm    1518m     1525cm    1618cm

История команд

Фикс ~/.bash_history

# avoid duplicates
export HISTCONTROL=ignoredups:erasedups  
# append history entries
shopt -s histappend
# After each command, save and reload history
export PROMPT_COMMAND="${PROMPT_COMMAND:+$PROMPT_COMMAND$'\n'}history -a; history -c; history -r"

Таймстампы в history

export HISTTIMEFORMAT="%d/%m/%y %T "

Топ команд из history

$ history | awk '{a[$2]++ } END{for(i in a){print a[i] " " i}}' | sort -rn | head -n 10
110 git
96 cd
80 ls
77 sudo
25 chmod
24 curl
17 ps
15 reset
14 zypper
13 man

История команд

Исключение записи в history

Проблел перед командой — must have при передаче паролей в открытом виде (в mysql, например):
~ $ pwd
/home/user

~ $ history | tail -n 2
 1030  pwd
 1031  history | tail -n 2

~ $  cd /usr/share

/usr/share $ history | tail -n 2
 1030  pwd
 1031  history | tail -n 2

Повтор предыдущей команды

Вот такая (
!!
) штука спасает от лишних манипуляций с хоткеями:
$ ls /var/log/apache2/
ls: невозможно открыть каталог /var/log/apache2/: Отказано в доступе

$ sudo !!
sudo ls /var/log/apache2/
access_log  del_access.log.gz  error_log

Сетевые полезности

«Однострочные» web-серверы

Самый знаменитый однострочный сервер через
nc
— работает до первого запроса, после чего сдыхает:
nc -v -l 80 < file

Более усовершенствованная версия:
:;while [ $? -eq 0 ];do nc -vlp 8080 -c'(r=read;e=echo;$r a b c;z=$r;while [ ${#z} -gt 2 ];do $r z;done;f=`$e $b|sed 's/[^a-z0-9_.-]//gi'`;h="HTTP/1.0";o="$h 200 OK\r\n";c="Content";if [ -z "$f" ];then ($e $o;(for n in *;do if [ -f "$n" ]; then $e "`ls -gh \"$n\"`
";fi;done););elif [ -f "$f" ];then $e "$o$c-Type: `file -ib \"$f\"`\n$c-Length: `stat -c%s \"$f\"`";$e;$e $f>&2;cat "$f";else $e -e "$h 404 Not Found\n\n404\n";fi)';done

И два минисервера от клевого Python (будут запущены в текущей директории):
#Python 2.x:
python -m SimpleHTTPServer [PORT]

#Python 3.x:
python -m http.server [PORT]

Сетевые полезности

Получение внешнего IP-адреса

$ curl ifconfig.me # или icanhazip.com
217.25.208.58

Сохранение вывода ifconfig в png-файл

ifconfig | convert label:@- ifconfig.png

Заголовок статьи с Wikipedia

$ dig +short txt linux.wp.dg.cx # 'keyword'.wp.dg.cx
"Linux ( or ) is a Unix-like computer operating system assembled under the model of free and open source software development and distribution. The defining component of Linux is the Linux kernel, an operating system kernel first released 5 October 1991 by" " Linus Torvalds. http://en.wikipedia.org/wiki/Linux"

Сетевые полезности

ping + traceroute = mtr

$ sudo mtr github.com
                                    My traceroute  [v0.82]
sammy (192.168.0.102)                                                 Sat Oct  4 03:00:26 2014
Keys:  [H]elp   [D]isplay mode   [R]estart statistics   [O]rder of fields   [q]uit
                                                           Packets                  Pings
 Host                                               Loss%    Snt   Rcv Drop   Best   Avg  Wrst
 1. 192.168.0.1                                      0.0%    145   145    0    0.8   2.3  53.9
 2. 10.254.253.253                                   0.0%    145   145    0    1.5   3.1  47.7
 3. mx480.omkc.ru                                    0.0%    145   145    0    1.5   5.7 101.4
 4. rt1.omkc.ru                                      2.8%    145   141    4    1.7   4.5 197.3
 5. 37.29.107.237                                    0.0%    145   145    0    2.9   5.6  75.8
 7. ffm-b10-link.telia.net                           0.0%    144   144    0   80.3  82.8 112.5
 8. ffm-bb2-link.telia.net                           0.0%    144   144    0   80.3  90.0 229.4
 9. ffm-b12-link.telia.net                           0.0%    144   144    0   80.6  83.2 136.3
10. ntt-ic-155239-ffm-b12.c.telia.net                0.0%    144   144    0   93.4  95.4 157.2
11. ae-2.r20.frnkge04.de.bb.gin.ntt.net              0.0%    144   144    0   93.7  98.6 141.7
12. ae-7.r20.asbnva02.us.bb.gin.ntt.net              0.7%    144   143    1  171.0 177.7 259.0
13. ae-1.r06.asbnva02.us.bb.gin.ntt.net              0.0%    144   144    0  177.3 181.3 220.6
14. xe-0-3-0-18.r05.asbnva02.us.ce.gin.ntt.net       0.0%    144   144    0  168.8 172.6 224.6
15. 192.30.252.207                                   0.0%    144   144    0  177.2 182.0 242.9
16. github.com                                       0.0%    144   144    0  177.1 180.7 215.0

Время в терминале

Tput

while sleep 1;do tput sc;tput cup 0 $(($(tput cols)-29));date +"%T | %d.%m.%y | %A";tput rc;done &

Figlet

watch -t -n1 "date +"%T%n%d.%m.%y"|figlet"

Полезные мелочи

tac
разворачивает текст, как
sed '1!G;h;$!d'
или
sed -n '1!G;h;$p'
, но быстрее
shred
перезаписывает файл случайными данными заданное число раз
sudo touch /forcefsck
принудительный чекдиск после ребута
reset
переинициализация терминала (например, после вывода двоичных данных)
htop
лучшая замена дефолтному
top
nl
нумерация строк (не нумерует пустые строки, в отличии от
cat -n
)
tailf
системный алиас на
tail -f
ncdu
аналог
du
, работающий на ncurses
numfmt --from=si 1M
форматирует число, умеет и в обратную сторону
dmidecode
информация о системе
hwinfo
информация о железе (лучше использовать с флагом
--short
)
lscpu; lspci; lsusb
информация о cpu/pci/usb
time read -sn1
секундомер по [enter]