какие ваши любимые функции командной строки или трюки?

<p>поделитесь своими возможностями и приемами командной строки для unix/linux. постарайтесь сохранить его независимым от shell/distro, если это возможно. интересуются просмотром псевдонимов, однострочников, сочетаний клавиш, небольших сценариев оболочки и т.д.</p>

<p>это несколько расширяет <code>!!</code> трюк, упомянутый в <a href="https://unix.stackexchange.com/questions/6/what-are-your-favorite-command-prompt-features-or-tricks/32#32">этот ответ</a> . на самом деле есть куча связанных с историей команд, о которых обычно забывают (люди, как правило, наносят удар <kbd>up</kbd> 100 раз вместо того, чтобы искать команду, которую они знают, что они напечатали).</p><ul> <li>команда <code>history</code> покажет список недавно выполненных команд с указателем события слева</li> <li><code>!n</code> заменит команду, связанную с указателем события <code>n</code></li> <li><code>!-n</code> заменит <code>n</code> <sup>го</sup> самая последняя команда; например <code>!-1</code> заменит самую последнюю команду, <code>!-2</code> второй самый последний и т. д.</li> <li>как уже упоминалось в другом ответе, <code>!!</code> это сокращение от <code>!-1</code>, чтобы быстро подставить последнюю команду</li> <li><code>!string</code> заменит самую последнюю команду, которая начинается с <code>string</code></li> <li><code>!?string?</code> заменит самую последнюю команду, содержащую <code>string</code></li> </ul><hr><p>обозначения слов могут быть добавлены к <code>!</code> команда истории, чтобы изменить результаты. двоеточие разделяет обозначения события и word, например <code>!!:0</code>. обозначение события <code>!!</code> может быть сокращено до <code>!</code> при использовании указателя word, поэтому <code>!!:0</code> эквивалентно <code>!:0</code>.</p><ul> <li><code>!:0</code> получит команду, которая была выполнена</li> <li><code>!:1</code> получит первый аргумент (и <code>!:2</code> второй и т. д.)</li> <li><code>!:2-3</code> получит второй и третий аргументы</li> <li><code>!:^</code> это еще один способ получить первый аргумент. <code>!:$ получит последнее !: получит все аргументы (но  не  команда) модификаторы также могут быть добавлены к ! история команды, каждая с префиксом двоеточия. можно сложить любое число (например, !:t:r:p). h - линия к основному имени файла t - только базовое имя файла r - строка с расширением имени файла e - только расширение файла s/search/replacement - заменить первое вхождение search на replacement gs/search/replacement - заменить все вхождения search на replacement 

<strong>bash - вставить последний параметр предыдущей строки</strong>alt-. самая полезная комбинация клавиш, попробуйте и посмотрите, почему-то никто не знает об этом.нажмите ее снова и снова, чтобы выбрать более старые последние параметры.замечательно, когда вы хотите сделать что-то еще с аргументом/файлом, который вы использовали только минуту назад.

мой любимыйman 7 ascii просто и очень полезно. oct dec hex char oct dec hex char ──────────────────────────────────────────────────────────────────────── 000 0 00 nul '0' (null character) 100 64 40 @ 001 1 01 soh (start of heading) 101 65 41 a 002 2 02 stx (start of text) 102 66 42 b 003 3 03 etx (end of text) 103 67 43 c 004 4 04 eot (end of transmission) 104 68 44 d 005 5 05 enq (enquiry) 105 69 45 e 006 6 06 ack (acknowledge) 106 70 46 f 007 7 07 bel 'a' (bell) 107 71 47 g 010 8 08 bs 'b' (backspace) 110 72 48 h 011 9 09 ht 't' (horizontal tab) 111 73 49 i 012 10 0a lf 'n' (new line) 112 74 4a j 013 11 0b vt 'v' (vertical tab) 113 75 4b k 014 12 0c ff 'f' (form feed) 114 76 4c l 015 13 0d cr 'r' (carriage ret) 115 77 4d m 016 14 0e so (shift out) 116 78 4e n 017 15 0f si (shift in) 117 79 4f o 020 16 10 dle (data link escape) 120 80 50 p 021 17 11 dc1 (device control 1) 121 81 51 q 022 18 12 dc2 (device control 2) 122 82 52 r 023 19 13 dc3 (device control 3) 123 83 53 s 024 20 14 dc4 (device control 4) 124 84 54 t 025 21 15 nak (negative ack.) 125 85 55 u 026 22 16 syn (synchronous idle) 126 86 56 v 027 23 17 etb (end of trans. blk) 127 87 57 w 030 24 18 can (cancel) 130 88 58 x 031 25 19 em (end of medium) 131 89 59 y 032 26 1a sub (substitute) 132 90 5a z 033 27 1b esc (escape) 133 91 5b [ 034 28 1c fs (file separator) 134 92 5c  '' 035 29 1d gs (group separator) 135 93 5d ] 036 30 1e rs (record separator) 136 94 5e ^ 037 31 1f us (unit separator) 137 95 5f _ 040 32 20 space 140 96 60  041 33 21 ! 141 97 61 a 042 34 22 " 142 98 62 b 043 35 23 # 143 99 63 c 044 36 24 $ 144 100 64 d 045 37 25 % 145 101 65 e 046 38 26 & 146 102 66 f 047 39 27 ' 147 103 67 g 050 40 28 ( 150 104 68 h 051 41 29 ) 151 105 69 i 052 42 2a * 152 106 6a j 053 43 2b + 153 107 6b k 054 44 2c , 154 108 6c l 055 45 2d - 155 109 6d m 056 46 2e . 156 110 6e n 057 47 2f / 157 111 6f o 060 48 30 0 160 112 70 p 061 49 31 1 161 113 71 q 062 50 32 2 162 114 72 r 063 51 33 3 163 115 73 s 064 52 34 4 164 116 74 t 065 53 35 5 165 117 75 u 066 54 36 6 166 118 76 v 067 55 37 7 167 119 77 w 070 56 38 8 170 120 78 x 071 57 39 9 171 121 79 y 072 58 3a : 172 122 7a z 073 59 3b ; 173 123 7b { 074 60 3c < 174 124 7c | 075 61 3d = 175 125 7d } 076 62 3e > 176 126 7e ~ 077 63 3f ? 177 127 7f del </code></pre><hr><p>взгляните на этот сайт <a href="http://www.commandlinefu.com/commands/browse">commandlinefu.com</a> .</p><p>вы также можете посмотреть эти четыре статьи петериса круминьша в его блоге.</p><ul> <li> <a href="http://www.catonmat.net/blog/top-ten-one-liners-from-commandlinefu-explained/">10 лучших однострочников из объяснения commandlinef</a> </li> <li> <a href="http://www.catonmat.net/blog/the-next-ten-one-liners-from-commandlinefu-explained/">следующие десять однострочников от commandlinefu объяснены</a> </li> <li> <a href="http://www.catonmat.net/blog/another-ten-one-liners-from-commandlinefu-explained/">еще десять однострочников из объяснения commandlinef</a> </li> <li> <a href="http://www.catonmat.net/blog/yet-another-ten-one-liners-from-commandlinefu-explained">еще одна десять однострочников от объяснения commandlinef</a> </li> </ul>

<p>выполните последнюю команду как root:</p><pre><code>sudo !! </code></pre>

<p>не уверен, что это считается "уловкой", но люди, похоже, очень не знают о стандартных горячих клавишах readline. особое применение в оболочках:</p><ul> <li><kbd>ctrl</kbd>+<kbd>u</kbd> - вырезать текущую строку</li> <li><kbd>ctrl</kbd>+<kbd>y</kbd> - вставить отрезок с <kbd>ctrl</kbd>+<kbd>u</kbd></li> <li><kbd>ctrl</kbd>+<kbd>l</kbd> - очистить экран и перерисовать текущую строку</li> <li><kbd>ctrl</kbd>+<kbd>g</kbd> - получить новую строку и отказаться от текущей</li> </ul>

<p><kbd>ctrl</kbd>+<kbd>r</kbd> в bash для поиска/активации ранее выполненных команд (содержимое ~/.bash\_history).</p><p>это часто очень полезно. запустив этот псевдоним, вы получите pwd через http (индексированный) через порт 8000:</p><pre><code>alias webserver="python -m simplehttpserver" </code></pre><p>и поскольку я постоянно запускаю make, слишком быстро набираю и печатаю, эти псевдонимы, вероятно, наиболее часто используются (серьезно):</p><pre><code>alias maek=make alias mkae=make alias meak=make alias amka=make alias akme=make </code></pre><p>и, вероятно, мой наиболее часто используемый фрагмент bash - это простой скрипт, который я называю upload. я использую его для перетаскивания любого типа контента в мой linode, и он копирует полученный url-адрес http в мой буфер обмена (средний щелчок). очень полезно для вставки материала людям в irc:</p><pre><code>scp -r $ $user@$host:public_html && { url="http://$host/~$user/$(basename $1)" echo "$url" xselection -replace primary "$url" } просто пара. я могу опубликовать гораздо больше позже, должен вернуться к работе!

diff вывод двух команд без создания временного файла вручную (bash):diff <(ls dir1) <(ls dir2) 

довольно простой, но люди, кажется, не знают, возвращает вас к предыдущему каталогу:cd - 

<strong> <a href="http://snap.nlc.dcccd.edu/reference/bash1/features_11.html">расширение скобок : </strong><blockquote> разбивка скобок - это механизм, с помощью которого можно генерировать произвольные строки. </blockquote>это позволяет заменить утомительные строки, такие как:mv loong/and/complex/file/name loong/and/complex/file/name.bacukup с более коротким экземпляромmv loong/and/complex/file/name{,backup}  некоторые другие применения# to display the diff between /etc/rc.conf and /etc/rc.conf.pacsave diff /etc/rc.conf{,.pacsave} # to list files in both /usr/share and /usr/local/share ls /usr/{,local}/share <strong> арифметическое расширение </strong>:<blockquote> арифметическое расширение позволяет оценить арифметическое выражение и заменить результат. формат для арифметического расширения: $((expression)) </code></pre> <p>выражение обрабатывается так, как если бы оно было в двойных кавычках, но двойные кавычки в скобках специально не обрабатываются. все токены в выражении подвергаются раскрытию параметров, расширению строк, подстановке команд и удалению кавычек. арифметические разложения могут быть вложенными.</p> </blockquote><pre><code>$ a=1 $ b=2 $ echo $(( a+(b*2) )) 5 </code></pre>

<p>обычно это в моем скрипте запуска (.bashrc, .profile, что угодно)</p><p><code>shopt</code> боже, проверьте комментарии:</p><pre><code>shopt -s cdspell # try to correct typos in path shopt -s dotglob # include dotfiles in path expansion shopt -s hostcomplete # try to autocomplete hostnames </code></pre><p>псевдоним, который сохраняет нажатия клавиш: <code>mkdir</code> и <code>cd</code> в него:</p><pre><code>mkcd () { mkdir -p "$@" && cd "$@"; } </code></pre><p>и последнее, но не менее важное: я разочаровался в запоминании синтаксиса tar, поэтому:</p><pre><code>extract () { if [ -f $1 ] ; then case $1 in *.tar.bz2) tar xjf $1 ;; .tar.gz) tar xzf $1 ;; *.bz2) bunzip2 $1 ;; .rar) rar x $1 ;; *.gz) gunzip $1 ;; .tar) tar xf $1 ;; *.tbz2) tar xjf $1 ;; .tgz) tar xzf $1 ;; *.zip) unzip $1 ;; .z) uncompress $1 ;; *) echo "'$1' cannot be extracted via extract()" ;; esac else echo "'$1' is not a valid file" fi } </code></pre>

<p>две функции bash, которые спасают меня от множества нажатий клавиш.</p><p>делать автоматически и ls после каждого успешного cd:</p><pre><code>function cd { builtin cd "$@" && ls } поднимитесь на n уровней:# usage .. [n] function .. (){ local arg=${1:-1}; local dir="" while [ $arg -gt 0 ]; do dir="../$dir" arg=$(($arg - 1)); done cd $dir #>&/dev/null } 

так как я обычно на полпути в командную строку, прежде чем хочу искать (ctrl-r в bash), в моем .bashrc есть следующееbind '"e[a"':history-search-backward bind '"e[b"':history-search-forward это означает, что если я ввожу cd, затем нажимаю вверх/вниз, я вижу все опции, к которым у меня есть cd'd. в основном я использую это для часто используемых dirs. как "cd w", и я в конечном итоге пройти через все рабочие места, которые я использую много.

одна вещь, которая экономит мне много времени, это команды pushd/popd. эти ребята позволяют вам создавать стопку каталогов и значительно сокращают количество набираемых текстов:/foobar/ > pushd /src/whatever/foo/test /foobar/src/whatever/foo/test > make run /foobar/src/whatever/foo/test > popd /foobar/ > make 

screen <a href="/http://www.rackaid.com/resources/linux-screen-tutorial-and-how-to/">команда . это в основном сохраняет ваш сеанс командной строки, когда вы вернетесь. это своего рода менеджер терминалов, как менеджер окон. таким образом, в одном терминальном сеансе вы можете использовать несколько виртуальных терминалов. это очень круто.если кто-то использует screen, эту функцию shell (поместите в .bashrc) чрезвычайно полезно:function scr { if screen -ls | grep -q main; then # reattach to main: screen -xr main else # name session "main": screen -s main fi } после ввода scr он проверит, существует ли ваш основной сеанс, и подключится к нему. в противном случае это создаст его.

если вам нужно отредактировать особенно длинную командную строку в bash^x^e (ctrl-x ctrl-e) откроет его в редакторе ($ editor).</p><p>в zsh вы можете получить то же поведение, добавив это в .zshrc:</p><pre><code>autoload edit-command-line zle -n edit-command-line bindkey '^x^e' edit-command-line </code></pre>

<p>если вы быстро печатаете, это пригодится:</p><pre><code>alias grpe='grep --color=tty' alias gpre='grep --color=tty' alias rgep='grep --color=tty' alias gerp='grep --color=tty' </code></pre><p>этот макрос помогает вам вычислить итоги столбца вывода: размеры файлов, байты, пакеты, все, что вам нужно сделать, это указать столбец, который вы хотите добавить:</p><pre><code>total () { if [ x$1 = x ]; then set echo 1; fi awk "{total += $$1} end {print total}" } вы используете его, например, без аргументов, он добавляет итог первого столбца:du | total если вы предоставите аргумент, он будет суммировать этот столбец, например, это даст вам общее количество байтов, используемых всеми файлами c # в/tmp:ls -l /tmp/cs | total 5 иногда ваша консоль портится из-за того, что вы случайно просмотрели двоичный файл (например, cat/bin/ls), вы можете восстановить терминал с помощью этой функции shell:restaura () { perl -e 'print "e)b";' } мне нравится, когда моя ls использует символы, чтобы различать класс файлов, а также скрывать файлы резервных копий, сгенерированные моим редактором (файлы резервных копий заканчиваются символом ~):alias ls='ls -fb' 

alias s='sudo' alias r='rake' # i'm a ruby developer alias ..='cd ..' # although with autocd feature for zsh this comes packed. один из моих любимых, когда я забываю s:$ s !! # last command with super user priviledges </code></pre>

<p>если команда принимает ввод stdin, вы можете прочитать ввод из файла с помощью <code><filename</code>. это может появиться в любом месте команды, поэтому эти строки эквивалентны:</p><pre><code>cat filename cat <filename <filename cat </code></pre><p>это особенно полезно для grep, так как позволяет поместить выражение в конец строки, поэтому вы можете быстро изменить команду grep, нажав <kbd>up</kbd>, без необходимости прокрутки влево, чтобы пройти имя файла:</p><pre><code><filename grep 'expression' </code></pre>

<p>вы можете использовать <code>cdpath</code>, чтобы установить эквивалент каталога <code>path</code>; если вы попытаетесь <code>cd foo</code> и в текущем каталоге нет <code>foo</code>, оболочка проверит каждый из каталогов в <code>cdpath</code>, ищет в них <code>foo</code>, и переключится на первый находки:</p><pre><code>export cdpath="/usr" cd bin # switches to 'bin' if there is one in the current directory, or /usr/bin otherwise </code></pre>

<pre><code>vi `which scriptname` </code></pre><p>потому что, когда ты не знаешь, где что-то живет, тебе тоже все равно.</p>

<p><strong>амперсанд</strong>. это помещает вашу команду в фоновый режим, так что вы можете продолжить печатать.</p><pre><code>$> sudo updatedb & работая вместе, и через некоторое время вы видите:[1] 17403 и ваш процесс завершен! отлично подходит для вещей, где вам не нужно ждать их окончания.

<strong>завершение табуляции</strong>. как плохо было бы отстой, если бы вам пришлось печатать все символы каждого пути?

у меня есть это в моем .bashrc#shortcut for ctrl+c and ctrl+v alias c-c='xclip -sel clip' alias c-v='xclip -o -sel clip' function find-all() { python -c "import re import sys for i in re.findall('$1', sys.stdin.read()): if type(i) == type(''): print i else: print i[0]" } </code></pre><p>и когда у меня есть исходный код html в буфер обмена и хочу найти все ссылки, которые я использую</p><pre><code>c-v | find-all 'href="([^"]*)"' | c-c </code></pre><p>и у меня есть все url в буфер обмена</p><p>у меня тоже есть эта функция</p><pre><code>function lsq(){ ls -lh $@ | tr -s ' ' | cut -d' ' -f5,8 } какой размер дисплея (удобочитаемый) и имя файла.alias temp='cat /proc/acpi/thermal_zone/thrm/temperature' этот псевдоним для показаfunction separate() { python -c "import sys,re; print '$1'.join(re.split('\s*', sys.stdin.read().strip()))"; } </code></pre><p>с помощью этой функции я могу рассчитать произведение или сумму аргументов.</p><pre><code>alias sum='separate + | bc' alias product='separate * | bc' function split-join() { python -c "import sys,re; print '$2'.join(re.split('$1', sys.stdin.read().strip()))"; } </code></pre><p>это полезная функция, которая разделяет стандартный ввод, разделенный регулярным выражением, и затем объединяет результат.</p><pre><code>function factorial() { seq -s* $1 | bc } факторная функцияfunction wiki() { dig +short txt $1.wp.dg.cx; } </code></pre><p>эта функция отображает текст вики над dns</p><p>у меня также есть три функции цвета</p><pre><code>function blue() { echo -e "\x1b[34m\x1b[1m"$@"x1b[0m"; } function green() { echo -e "x1b[32mx1b[1m"$@"\x1b[0m"; } function red() { echo -e "\x1b[31m\x1b[1m"$@"x1b[0m"; } function md5check() { test md5sum $2 | cut -d' ' -f1` = "$1" && green [ok] || red [fail] } эта функция проверяет хэш-файл md5.это покажет сообщение об ошибке для данного кодаfunction strerror() { python -c "import os; print os.strerror($1)"; } </code></pre><p>вы можете распечатать все сообщения с</p><pre><code>alias all-errors='for i in `seq 131`; do echo -n "$i: "; strerror $i; done' </code></pre>

<p>размонтировать последнее подключенное устройство:</p><pre><code>mount /media/whatever ... u!mo </code></pre><p><code>!mo</code> расширяется до последней команды, которая началась с <code>mo</code> (по крайней мере, в bash). иногда каждый делает <code>mv</code> посередине, поэтому <code>u!m</code> не будет работать так часто.</p>

<p>еще один полезный трюк zsh:</p><p>обработайте вывод команды как файл:</p><pre><code>emacs =(hg cat -r 100 somefile) </code></pre><p>это открывает старую версию отслеживаемого mercurial файла в emacs для просмотра с подсветкой синтаксиса. без этого мне пришлось бы возиться с <code>hg revert</code>, <code>hg archive</code> или явным образом отправьте <code>hg cat</code> вывод во временный файл.</p><p>конечно, это работает с любой программой, которая открывает файлы, и любой программой, которая печатает на стандартный вывод.</p>

<p>специфической особенностью zsh являются псевдонимы суффиксов, которые задаются с помощью <code>alias</code> the <code>-s</code> флаг:</p><pre><code>alias -s ext=program </code></pre><p>если у данного расширения есть псевдоним суффикса, вы можете выполнить файл с этим расширением напрямую, и zsh запустит данную программу и передаст имя файла в качестве аргумента. так что, если вышеупомянутый псевдоним действует, эти строки эквивалентны:</p><pre><code>/path/to/foo.ext program /path/to/foo.ext </code></pre>

<p>одна из моих самых любимых функций zsh - это каталоги. вы можете экспортировать переменную с заданным именем, со значением, указывающим на определенный путь:</p><pre><code>export foo=/usr/bin </code></pre><p>теперь вы можете использовать <code>~foo</code> в команде для ссылки на <code>/usr/bin</code>:</p><pre><code>cd ~foo ~foo/ls cat ~foo/filename </code></pre>

<ul> <li> <p>команда "ничего не делать" <code>:</code> как в</p> <pre><code>while :; do :; done </code></pre></li> <li> <p>расширение раскоса в сочетании с петлями для:</p> <pre><code>for c in {1..3}; do :; done </code></pre></li> <li> <p><code>!</code> оператор и операторы короткого замыкания <code>||</code> а также <code>&&</code></p> <pre><code>[ -d /tmp/dir ] || mkdir /tmp/dir if ! ping 34.41.34.1; then :; fi </code></pre></li> <li> <p>использование вложенных оболочек вместо pop/push (удобно в скриптах)</p> <pre><code>~$ ( cd /tmp; echo $pwd ) /tmp ~$   вид что есть команда type ~$ type type type is a shell builtin ~$ type ls ls is aliased to ls --color=auto' ~$ f(){ :; } ~$ type f f is a function f () { : }   тоже очень приятно: вот-нить ~$ cat <<<"here $pwd" here /home/yourname ~$ </code></pre></li> <li> <p>и мой любимый: перенаправление на список команд</p> <pre><code>{ w; ps; ls /tmp; } 2>/dev/null |less </code></pre></li> </ul>

<p>смотрите это <strong> <a href="https://unix.stackexchange.com/questions/2062/grep-why-do-brackets-in-grep-pattern-remove-the-grep-process-from-ps-results">вопрос</a> </strong>.</p><p>когда вы запускаете <code>ps ax | grep string</code>:</p><pre><code>[steve@sage-arch ~]$ ps ax | grep 'openbox' 3363 ? ss 0:00 /usr/bin/openbox 3382 ? ss 0:00 /usr/bin/ssh-agent -- /usr/bin/openbox-session 3386 ? s 0:00 /bin/sh /usr/bin/openbox-session 3388 ? s 0:00 /bin/sh /usr/bin/openbox-session 3389 ? s 0:00 /bin/sh /usr/bin/openbox-session 3390 ? s 0:00 /bin/sh /usr/bin/openbox-session 5100 pts/0 s+ 0:00 grep openbox последняя строка, содержащая grep, немного раздражает <strong> </strong>вы можете избавиться от этого, запустив ps ax | grep '[s]tring':[steve@sage-arch ~]$ ps ax | grep '[o]penbox' 3363 ? ss 0:00 /usr/bin/openbox 3382 ? ss 0:00 /usr/bin/ssh-agent -- /usr/bin/openbox-session 3386 ? s 0:00 /bin/sh /usr/bin/openbox-session 3388 ? s 0:00 /bin/sh /usr/bin/openbox-session 3389 ? s 0:00 /bin/sh /usr/bin/openbox-session 3390 ? s 0:00 /bin/sh /usr/bin/openbox-session </code></pre><hr><p><strong> обновить </strong>: или просто запустить <code>pgrep string</code></p>

<p>иногда настройки bash таковы, что <code>rm</code> имеет псевдоним <code>rm -i</code> и, следовательно, требует подтверждения для каждого удаляемого файла. когда я иногда работаю с таким аккаунтом, я использую <code>\rm</code> для получения исходного поведения <code>rm</code> без изменения пользовательской конфигурации.</p>

<p>я люблю бросать столько вещей, сколько могу в мою ps1. несколько полезных вещей для запоминания:</p><p><code>\e[s</code> а также <code>\e[u</code> сохранить и отменить сохранение позиции курсора соответственно. я использую это для создания "информационной панели" в верхней части экрана, длиной в пару строк, которая может вместить больше материала. пример:</p><pre><code>ps1='\[\e[s\e[7m\e[1;1h\]\w\n\t \j / \! / \#\[\e[u\e[0m\e[33;1m\][\u@\h \[\e[34m\]\w]\[\e[0m\]\$ ' объединить с alias clear='echo -e "e[2jn"'. попробуйте!так же prompt_command переменная определяет команду для выполнения перед ps1 каждый раз.еще одна команда bg. если вы забыли поставить & в конце команды, просто нажмите ^z и введите bg, и он будет работать в фоновом режиме.

отобразить ветку git и статус в приглашении export git_ps1_showdirtystate = true if ["$ color\_prompt" = yes]; затем ps1 = '$ {debian_chroot: + ($ debian\_chroot)}\[\ 033 [01; 32m \]\u @\h\[\ 033 [00m \]:\[\ 033 [01; 34m \]\w\[\ 033 [00m \] $ (__ git_ps1 "#% s")$ ' else ps1 =' $ {debian_chroot: + ($ debian\_chroot)}\u @\h:\w $ (__ git_ps1 "#% s")$ ' fi </pre>

<p>моя любимая команда 'найти', я использую ее везде ... примеры:</p><pre><code>find . -name "*.log" -exec ls -l {} \; | grep "$(find . -name ".log" -exec ls -l {} ;| nawk '{print $5}' | sort -n | tail )" </code></pre><p>просто отобразите тяжелые файлы в формате ls -l (long).</p><p>затем, если вам нужен код с разрешениями 0640, просто выполните поиск:</p><pre><code>find . \( \( ! -perm 0640 \) -a \( -name "*.cpp" -o -name "*.h" \) \) -ls | nawk '{print $3"t"$11}' </code></pre><p>или заменить:</p><pre><code>find . \( -name "*.cpp" -o -name "*.h" \) | xargs chmod 640 </code></pre><p>тогда вам нужен символ и не знаете, где он?</p><pre><code>( for myobj in $(find . -name ".o"); do gotsym=$(dump -xany -t $myobj | grep .my_symbol) if ! test "x$gotsym" = "x" then echo "object [$myobj] ========================" echo "$gotsym" echo "^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^"^ fi done ) </code></pre><p>новые файлы, чем xfile ??</p><pre><code>find . -newer xfile -type f </code></pre><p>ага, "найди" рулез!</p>

<p>однажды так часто, когда вы набрали длинную команду и, прежде чем закончить ее, вы поняли, что она не сработает сразу, потому что вам нужно запустить что-то еще до (например, введено <code>git commit -m "long commit message here"</code>), вы можете нажать <code>^a^k</code> чтобы перейти к началу строки и уничтожить ее (сохранение в буфере), затем запустить команду для исправления и, наконец, <code>^y</code> вставить вставленную команду и продолжить. сохраняет много повторного набора. все это, конечно, когда <code>readline</code> находится в режиме emacs.</p><p>еще одна экономия времени: <code>mkdir -p some/nested/dirs/to/be/created</code> создает все каталоги в пути, если они отсутствуют.</p>

<p>отображает красивую графику ascii текущего дерева процессов с выделением наиболее интенсивного процесса.</p><pre><code>while true; do clear; pstree $( ps -eo pid --sort %cpu | tail -n 1 ); sleep 1; done убей его с помощью ctrl + c

смотрите вывод команды обновляется каждые n секундwatch -n 60 df -h (displays df -h every 60 seconds) показать статистику о сетевом устройстве wlan0ip -s link ls wlan0 показать таблицу маршрутизации для устройства eth1ip route ls dev eth1 показать статистику для всех пакетов маршрутизаторов, через которые проходит узелmtr --interval 5 hostname обратитесь к обратным dns-записям для имен хостов в сетиnmap -sl network оцените веб-сайтab получить все ссылки с веб-страницыlynx -dump http://www.yahoo.com | awk '/http/{print $2}' </code></pre><p>показать шлюз по умолчанию</p><pre><code>netstat -rn | awk '/ug/{print $2}' записать стандартную ошибку в файлfoo 2> errors.txt перенаправить stderr на стандартный выводfoo 2>&1 перенаправьте как stderr, так и stdout в один и тот же файл.foo > file.txt 2>&1 

change chmod to file dowloaded --> $\_ wget -c http://link/to/file -o /path/to/save/namefile && chmod 0755 $_ # extract tar.bz2 or tar.gz whit less work # this avoids having to unpack and then move the files to another location, in this case have # already extracted in the desired location tar jxvf file.tar.bz2 -c /pat/to/extract # calculator with bc - in bashrc calc(){ echo "scale=2;$@" | bc;} # set magic-space in bashrc bind space:magic-space # !pin<space> expand last cmd pin... # alias to open last edited file in vim alias lvim="vim -c \"normal '0\"" # alias to show your path set alias path='echo -e ${path//:/n}' 

заменить части предыдущей команды:^поиск^replace$ echo a b c d a b c d $ ^b c^x echo a x d a x d отлично подходит для опечаток:$ mkae -bash: mkae: command not found $ ^ka^ak make [...] 

суммируйте размер каталога, с уменьшением человеческого размераdu -hs / | sort -hr например.10.2g foo/ 4m bar/ 

раскрытие двойной звезды с помощью zsh (который рекурсивно спускается в дерево каталогов, а не только на один уровень, что-то похожее на $(find ! -type d)</code>:</p><pre><code>grep string **/*.cc </code></pre>

<p>моя любимая особенность - нет цвета! знак равно</p><p>term = xterm-mono или term = linux-m зависит от ос ...</p><p>мне очень нравится черно-белый irssi, mc и любой другой инструмент "текстовый пользовательский интерфейс"</p>

<p>zsh имеет глобальные псевдонимы. это расширяет псевдоним в любом месте командной строки. я нашел это полезным для имен хостов:</p><p>например.:</p><pre><code>alias -g sub='sub.domain.tld' </code></pre><p>тогда я могу сделать, например:</p><pre><code>sftp sub ssh sub </code></pre><p>и т.п.</p>

<p>не совсем один, но я думаю, что это полезно. преобразуйте много файлов в верхний регистр, например <code>file\_to\_upper *php *c</code>. есть много подобных случаев, таких как преобразование в нижний, переименование всех файлов по суффиксу/префиксу и т.д.</p><pre><code>file\_to\_upper () { for file in "$@" do if [ ! -f "$file" ]; then echo "file $file does not exist"; else mv -f "$file" "`echo "$file" | tr '[a-z]' '[a-z]'" fi done return 0 } 

получить имя файла с самой последней отметкой времени в текущем каталоге:latest () { ls -lrt | tail -1 | awk '{print $nf}' }</code></p>

<pre><code>function calc() { echo $ p | dc } dc - калькулятор rpn; эта функция позволяет мне вводить выражение в качестве аргументов команды:$ calc 5 3 + 8 </code></pre>

<p>покажите подсказку, где имя хоста <strong>полужирный</strong>. некоторое время я пробовал цветовые подсказки, но в зависимости от фона цвет иногда выглядел бы плохо. bold работает для меня на светлом фоне, темном фоне, синем фоне и т.д.</p><p>это в моем .bashrc:</p><pre><code> bold=$(tput bold) reset=$(tput sgr0) export ps1="\u@\[$bold]h[$reset\]:\w \$ " 

я нашел следующие полезные при постоянном переключении между windows и unix/linux:alias dir="ls -l" alias copy="cp" alias del="rm" 

это для zsh, а не bash, fyi (если вы его не использовали, вы не пожалеете, что попробовали). это действительно полезно для быстрого ввода длинных путей для передачи scp. он работает так же, как использовать для завершения или список доступных имен файлов/каталогов.примерscp webdev@example.com:/home/webdev/domains/example.com/http.public/long завершит путь к /home/webdev/domains/example.com/http.public/longdirname.я плохо разбираюсь в примерах, но это должно дать вам идею. попробуйте, это действительно может сэкономить ваши пальцы от набора текста.# ssh completion zstyle ':completion::scp:' tag-order  files users 'hosts:-host hosts:-domain:domain hosts:-ipaddr"ip address ' zstyle ':completion::scp:' group-order  files all-files users hosts-domain hosts-host hosts-ipaddr zstyle ':completion::ssh:' tag-order  users 'hosts:-host hosts:-domain:domain hosts:-ipaddr"ip address ' zstyle ':completion::ssh:' group-order  hosts-domain hosts-host users hosts-ipaddr zstyle '' single-ignored show 

 <a href="http://pasky.or.cz//dev/retty/">retty , что позволяет перемещать запущенную программу с одного терминала на другой. таким образом, если у вас есть программа ncurses, работающая вне экрана, tmux или ssh, вы можете присоединить ее к сеансу ssh, сетевому экрану или сеансу tmux, запустив retty внутри терминала, где вы хотите использовать данную программу. другими словами, он похож на screen и tmux, но за исключением того, что (a) он может запускать только одну программу за раз, и (b) его можно запустить <strong> после </strong> вы запускаете дочерний процесс.

мой любимый способ - использовать команду python) для создания временного http-сервера:<blockquote> python -m simplehttpserver </blockquote>и доступ к файлам с этого компьютера по локальной сети как:<blockquote>  <a href="http://192.168.1.70:8000">http://192.168.1.70:80  </blockquote>другой способ - загрузить tar-файл в распакованном виде:<blockquote> wget -qo - <a href="http://192.168.1.70:8000/test.bz2">http://192.168.1.70:8000/test.bz2 | tar xjvf - </blockquote>здесь ссылка может быть любой через www, а bz2 может быть gz, tgz или bz2.

резервное копирование ваших модных точечных файлов автоматическимодульный .bashrc -> .bashrc.dmkdir -p ~/.bashrc.d cat<<'eof' >> ~/.bashrc echo "" echo -n ".bashrc.d warming up: " for script in ~/.bashrc.d/ ; do if [ -x "$script" ] ; then echo -n "${script##/} " . "$script" fi done echo "" echo "" echo " all systems are go." echo "" eof </code></pre><h1>более безопасный rm, совместимый с linux и mac os x</h1><pre><code>rm() { local src local final\_status=0 for src in "$@"; do # process only non command-line arguments. if [[ "$src" != -* ]]; then local trash="$home/.trash" if [ ! -e "$src" ]; then echo "safer rm: $src: no such file or directory." final_status=1 fi # create the trash directory if needed. if [ ! -d "$trash" ]; then # assume mac trash, but it'll work on *nix too. mkdir -p "$trash" if [ ! -d "$trash" ]; then echo "safer rm: unable to create trash directory $trash" echo "" echo " nothing moved or deleted. consider carefully:" echo "" echo " /bin/rm -rf $src" return 1 fi fi local dest="$trash/${src##*/}" # find a filename combination which does not already exist. if [ -e "$dest" ]; then # try appending iso datetime. dest="$dest.$(date +%y-%m-%dt%h-%m-%s)" if [ -e "$dest" ]; then local n=1 # try increasing monotony. while [ -e "$dest.$n" ]; do n = $[n + 1] done dest="$dest.$n" fi fi echo -n "safer rm: trashing $src to $dest ..." /bin/mv "$src" "$dest" echo " done." echo "" echo " to restore: /bin/mv '$dest' '$src'" echo "" echo " to purge: /bin/rm -rf '$dest'" echo "" echo "" fi done return $final_status } супер горячий "cd" up action# don't ask why i need 15 levels of cd .. alias ..='cd ..' alias .2='cd ../..' alias ...='.2' alias .3='cd ../../..' alias .4='cd ../../../..' alias .5='cd ../../../../..' alias .6='cd ../../../../../..' alias .7='cd ../../../../../../..' alias .8='cd ../../../../../../../..' alias .9='cd ../../../../../../../../..' alias .10='cd ../../../../../../../../../..' alias .11='cd ../../../../../../../../../../..' alias .12='cd ../../../../../../../../../../../..' alias .13='cd ../../../../../../../../../../../../..' alias .14='cd ../../../../../../../../../../../../../..' alias .15='cd ../../../../../../../../../../../../../../..' readline - твой единственный настоящий бог.bind -p | egrep -v '(not|self)' # no existential jokes included. терминальные шрифтыпосмотрев на миллиарды шрифтов, я использую 14 pt monaco, anti-aliased с iterm2.на mac (приложения): попробуйте это приложение, которое дает привязки клавиш.keycue (tm) (r) (c) ($) дает контекст почти любого запущенного приложения, просто удерживая <kbd>command</kbd>,.</p>

<p>функция автоматической отправки в zsh:</p><pre><code>setopt autopushd </code></pre><p>и вместе с этим:</p><pre><code>alias dirs='dirs -v' </code></pre><p>так что в любой момент я могу набрать <code>dirs</code> и получить историю того, где я был:</p><pre><code>0 /var/log 1 /tmp 2 /usr/local/bin 3 ~ </code></pre><p>и тогда я могу <code>cd</code> вернуться, например, в. <code>/usr/local/bin</code> набрав:</p><pre><code>cd ~2 </code></pre>

<p>ни один из следующих "трюков" не является технически сложным или впечатляющим, но они оказывают некоторое влияние на другого человека. если мы не можем использовать свою работу, чтобы сделать нашу жизнь счастливее, нам следует подумать еще раз о некоторых вещах.</p><p>мне нравится <code>alias</code>. мой любимый трюк - отредактировать ~/.bash\_aliases на компьютере моей девушки, когда она отсутствует, и добавить строку вроде:</p><pre><code>alias gfname='echo myname is thinking of you' </code></pre><p>или другая романтическая цитата.</p><p>еще один "трюк", который мне особенно нравится:</p><pre><code>#!/bin/bash xaa=123` for ((a=1; a <= xaa; a++)) do #sleep 1; mail -s "happy birthday $a" address@example.com < mails.txt done exit 0 где 123 - это человек, которому я хотел бы поздравить с днем рождения, а mails.txt содержит сообщение, которое я хотел бы написать как тело письма. сон 1; иногда необходимо, так как есть ограничение на fork (). вы также можете использовать аргументы командной строки $1</code> так далее...</p>

<p>в моей домашней папке есть папки с именами "документ", "загрузки", "temp" и т.д., причем первая буква заглавна. когда я работаю на терминале, раздражает сдвиг, нажимайте первую клавишу, когда вы переходите в каталог. просто введите следующее в свой терминал, и bash автоматически исправит ситуацию для вас.</p><pre><code>shopt -s nocaseglob </code></pre>

<p>используйте <code>pgrep foo</code> вместо <code>ps aux | grep foo</code> если вы хотите узнать, сколько экземпляров foo запущено и их pids:</p><p>например вместо <code>ps aux | grep firefox</code>, используйте <code>pgrep firefox</code></p>

<p>я не могу жить без</p><pre><code>set editing-mode vi set blink-matching-paren on </code></pre><p>в моем ~/.inputrc.</p><p>активирует их в каждом приложении с поддержкой readline. только активация редактирования командной строки vi в командной консоли работает через:</p><pre><code>set -o vi </code></pre><p>таким образом, нажав esc или ctrl + [ вы получите хорошо известный режим vi-command. и вы можете использовать мощные команды vi везде!</p>

<p>для этого есть отличный сайт: <a href="http://www.commandlinefu.com/commands/browse">http://www.commandlinefu.com/commands/browse</a> </p>

<p>мой личный фаворит</p><pre><code>find . -name <i>filename</i> | xargs grep -in '<i>pattern to search for</i>' </code></pre><p>команда, приведенная выше, находит файл с именем x, а затем ищет в указанном файле любой шаблон, который вы ищете. невероятно полезно, если вы ищете определенный фрагмент кода в файле, который находится где-то в ваших подкаталогах.</p>

<pre><code>find path expr -exec ls -ld {} \; </code></pre><p>хороший простой способ увидеть владельца, разрешения, размеры (если файлы) и другие характеристики того, что возвращает ваше выражение 'find'.</p>

<p>я часто замечаю, сразу после запуска 15-минутной команды, что я хотел бы добавить некоторые другие вещи в командную строку, используя <code>&&</code>. вместо того, чтобы прерывать уже запущенную работу, я стараюсь использовать <code>at</code>, чтобы поставить в очередь вторую, что дает мне больше времени, и мне не нужно наблюдать за терминалом.</p><p>как правило, <code>at</code> ставит в очередь задания для выполнения в определенный момент времени:</p><pre><code>$ at 14:30 > myscript > anotherscript > <ctrl-d> записи в очереди можно просмотреть с помощью atq и удалить с помощью atrm.еще одно дополнение к советам по настройке bash prompt: мне нравится инвертировать prompt, поскольку это дает хорошие визуальные подсказки, где вывод команды начинается и заканчивается в длинных списках терминалов. это хорошо работает как для яркого, так и для темного фона.export ps1="[e[7m][u@h w][e[0m]$ " </code></pre>

<p>синхронизации; синхронизация; синхронизация; перезагрузка</p><p>иногда может быть действительно полезным. быть осторожен !</p>

<p>я считаю, что понимание нажатий клавиш bash ведет к более эффективному обстрелу, и что многие из них прямо из emacs разъясняют их использование (т. е. <code>meta-xxx</code> это версия старшего брата <code>ctrl-xxx</code> обычно команда).</p><p>ключ "meta" обычно является ключом "alt", но также может быть ключом "esc". например <code>meta-f</code> можно получить с помощью <code>alt-f</code> или <code>esc f</code>.</p><p>чтобы сработали сопоставления альтернативных клавиш, вам, возможно, придется отключить "ключи доступа к меню" или их эквивалент в опциях консоли. в основном, если вы нажмете alt-f и откроете меню файла, отключите меню доступа к клавише alt.</p><p><code>ctrl-a / ctrl-e : move to start / end of line</code> основы, без которых не обойтись</p><p><code>ctrl-f, meta-f : forward char/word</code> нажатие alt-f переместит вас вперед на "1 слово", которое в командной строке в значительной степени является командой или аргументом</p><p><code>ctrl-b, meta-b : backwards char/word</code> то же самое, что и alt-f, но назад для перехода назад через командную строку</p><p><code>ctrl-d, meta-d : delete char/word</code> нажатие alt-d удалит (до конца) текущее слово под курсором. намного быстрее, чем удерживать клавишу delete в течение 30 секунд. полезно, когда вы завершаете вкладку в середине чего-либо и хотите переслать удаление до конца word.</p><p><code>ctrl-k : kill line</code> удаляет до конца строки</p><p><code>ctrl-u : undo</code> например набирая пароль, и вы знаете, что где-то ошиблись, вместо того, чтобы нажимать клавишу backspace 20 раз, просто нажмите ctrl-u. также очищает текущую командную строку.</p><p><code>meta-# : insert comment</code> это отлично подходит для сохранения командной строки, которую вы создаете, в качестве комментария перед ее запуском, если вам нужно сначала сделать что-то еще. это войдет в историю вашей команды, но не запустится.</p><p><code>ctrl-r : reverse search</code> поиск в обратном направлении по вашей истории shell (повторный ctrl-r для следующего совпадения)</p><p><code>ctrl-g : abort</code> если вы находитесь в середине <code>ctrl-r</code> и хотите просто вернуться туда, где вы печатали, просто прервите поиск с помощью <code>ctrl-g</code></p><p><code>meta-space / ctrl-x ctrl-x : set mark and jump to mark</code> если вам нужно быстро перейти к позиции в командной строке, сначала установите метку, а затем вернитесь к ней с помощью <code>ctrl-x ctrl-x</code>. обратите внимание, что вам, возможно, придется использовать <code>esc-space</code>, чтобы получить метку, установленную как <code>alt-space</code> часто связан с отключением консольного меню.</p><p><code>ctrl-] <char> : quick jump to <char></code> переходит вперед к символу, напечатанному после <code>ctrl-]</code> в командной строке. большой брат <code>meta-ctrl-] <char></code> прыгает назад.</p>

<p>мои любимчики ниже. я использую большинство из них регулярно</p><p>df -k (проверить файловые системы) kill или kill -9 (убить процесс) set -o vi (установить в командной строке значение vi) topas (инструмент производительности) mount/unmount</p><p>о да, и как я мог забыть> (перенаправить вывод в файл) ls> /tmp/tmp.txt</p><p>много еще, но некоторые с моей головы.</p>