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

Навигация осуществляется клавишами и
Горячие клавиши
Навигация
|
перейти в начало строки |
|
перейти в конец строки |
|
перемещает курсор на один символ назад |
|
перемещает курсор на один символ вперед |
|
перемещает курсор назад на одно слово |
|
перемещает курсор вперёд на одно слово |
|
стрелка вверх |
|
стрелка вниз |
Действия над символами
|
удалить слово перед курсором |
|
удалить слово после курсора |
|
удалить всю строку слева от курсора |
|
удалить всю строку справа от курсора |
|
удалить текущий символ |
|
удалить предыдущий символ |
|
вставить строку (слово, символ), удаленную через / / / etc |
|
удалить слово в строке до разделителя |
|
добавить в начало строки # (like a комментарий) |
Горячие клавиши
SIGINT / SIGTSTP / EOF
|
посылает сигнал SIGINT текущему процессу (аналог ) |
|
посылает SIGQUIT активной группе процессов |
|
посылает сигнал SIGTSTP текущему процессу, приостанавливая его выполнение |
|
посылает маркер EOF (аналог или ), если в строке нет символов |
Разное
|
то же самое, что и , но быстрее |
|
интеллектуальный поиск по истории команд |
|
выход из поиска |
|
ввод без очистки строки |
|
открывает текстовый редактор из для редактирования всей строки |
|
текущая версия bash (аналог ) |
Горячие клавиши (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
создает закладку thisPlacedeljmp thisPlace
удаляет закладку thisPlacejmp 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):
top
$ 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"
![]() |
![]() |
Полезные мелочи
|
разворачивает текст, как или , но быстрее |
|
перезаписывает файл случайными данными заданное число раз |
|
принудительный чекдиск после ребута |
|
переинициализация терминала (например, после вывода двоичных данных) |
|
лучшая замена дефолтному
|
|
нумерация строк (не нумерует пустые строки, в отличии от ) |
|
системный алиас на
|
|
аналог , работающий на ncurses |
|
форматирует число, умеет и в обратную сторону |
|
информация о системе |
|
информация о железе (лучше использовать с флагом ) |
|
информация о cpu/pci/usb |
|
секундомер по [enter] |



Source highlight: highlight.js / Github
Iconic font: Font-Awesome / Github
Licensed: Attribution Share Alike CC-BY-SA