Ответы:
Это несколько расширяет !!
трюк, упомянутый в этом ответе . На самом деле есть куча связанных с историей команд, о которых обычно забывают (люди, как правило, наносят удар Up100 раз вместо поиска команды, которую, как они знают, они набрали).
history
покажет список недавно выполненных команд с указателем события слева!N
заменит команду, связанную с указателем события N
!-N
заменит N
й последнюю команду; Например, !-1
будет подставлена самая последняя команда, !-2
вторая самая последняя и т. д.!!
это сокращение для !-1
быстрой замены последней команды!string
заменит самую последнюю команду, которая начинается с string
!?string?
заменит самую последнюю команду, которая содержит string
Обозначения слов могут быть добавлены в !
команду истории, чтобы изменить результаты. Двоеточие разделяет обозначения событий и слов, например !!:0
. Указатель события !!
может быть сокращен до просто !
при использовании обозначения слова, поэтому !!:0
эквивалентен !:0
.
!:0
получит команду, которая была выполнена!:1
получит первый аргумент (и !:2
второй и т. д.)!:2-3
получит второй и третий аргументы!:^
это еще один способ получить первый аргумент. !:$
получит последний!:*
получит все аргументы (но не команду)Модификаторы также могут быть добавлены в !
команду истории, каждый из которых начинается с двоеточия. Любое число может быть сложено (например !:t:r:p
).
h
- Линия до базового имени файлаt
- только базовое имя файлаr
- Линия до расширения имени файлаe
- только расширение файлаs/search/replacement
- Заменить первое вхождение search
сreplacement
gs/search/replacement
- Заменить все вхождения search
сreplacement
!-#
те. Я использую !string
для запуска последнюю команду, которая начинается со строки, но я обычно завершаю ее сначала (zsh), чтобы убедиться, что я правильно запускаю
!N
будет запускать команду ..." - это слишком узкое описание; собственно, !N
будет подставлена команда ...; и так далее для всех описаний в ответе. Более корректно и открывает гораздо больше полезных возможностей! Например, упомянутое sudo !!
.
bash
; в Emacs, чтобы просмотреть историю команд и значений ввода (для Mx или других значений чтения), вместо этого используется Meta-R (Meta-R также используется eshell
в Emacs). Поэтому я часто путаю их.
bash - вставить последний параметр предыдущей строки
alt-. самая полезная комбинация клавиш, попробуйте и посмотрите, почему-то никто не знает об этом.
нажмите ее снова и снова, чтобы выбрать более старые последние параметры.
замечательно, когда вы хотите сделать что-то еще с аргументом / файлом, который вы использовали только минуту назад.
alt
- .
он будет переходить к предыдущей команде и извлекать из нее последний аргумент. Так что если вы хотите последний аргумент из трех команд назад, просто нажмите alt
- .
три раза.
yank-last-arg
readline, поэтому она должна работать с любой программой, связанной с readline, а не только с BASH или ZSH.
Мой любимый
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
Взгляните на этот сайт commandlinefu.com .
Вы также можете посмотреть эти четыре статьи Петериса Круминьша в его блоге.
ascii
программа также полезна. Помимо печати таблицы, он позволяет запрашивать один или несколько отдельных символов.
Не уверен, что это считается «уловкой», но люди, похоже, очень не знают о стандартных горячих клавишах readline. Особое применение в оболочках:
Ctrl+L
соответствует символу FormFeed ascii. Обычно он перерисовывает экран в текстовых приложениях с помощью экранного окна (например, vim, less, mc и т. Д.). Хорошо, если экран был «загрязнен» каким-то выводом из другой программы.
Ctrl+W
разрезать одно слово назад, Alt+F
перейти вперед на одно слово, Alt+B
перейти на одно слово назад в строке. Мне нравится, Ctrl+Y
и Shift+Insert
потому что вы можете иметь две скопированные строки. Один с помощью Ctrl+U
(вставьте его Ctrl+Y
), и в то же время вы можете скопировать другое слово (выделить строку) вставить с ( Shift+Insert
).
CTRL+ Rв BASH для поиска / активации ранее выполненных команд (содержимое ~ / .bash_history).
Это часто очень полезно. Запустив этот псевдоним, вы получите PWD через HTTP (индексированный) через порт 8000:
alias webserver="python -m SimpleHTTPServer"
И поскольку я постоянно запускаю make, слишком быстро набираю и печатаю, эти псевдонимы, вероятно, наиболее часто используются (серьезно):
alias maek=make
alias mkae=make
alias meak=make
alias amka=make
alias akme=make
И, вероятно, мой наиболее часто используемый фрагмент BASH - это простой скрипт, который я называю upload. Я использую его для перетаскивания любого типа контента в мой Linode, и он копирует полученный URL-адрес HTTP в мой буфер обмена (средний щелчок). Очень полезно для вставки материала людям в IRC:
scp -r $* $user@$host:public_html && {
URL="http://$host/~$user/$(basename $1)"
echo "$URL"
xselection -replace PRIMARY "$URL"
}
Просто пара. Я могу опубликовать гораздо больше позже, должен вернуться к работе!
alias mk=make
Быстрее печатать и меньше вероятность ошибиться. Или скомпилируйте из своего редактора, используя горячую клавишу ...
alias m=make
, или даже m=make -j6
или подобное - за исключением того, что я уже использую alias m=mutt
☺
Довольно простой, но люди, кажется, не знают, возвращает вас к предыдущему каталогу:
cd -
cd..
от DOS укоренилась в моей мышечной памяти ...
cd
(без аргументов), который приведет вас в ваш домашний каталог.
Разбивка скобок - это механизм, с помощью которого можно генерировать произвольные строки.
Это позволяет заменить утомительные строки, такие как:
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
Арифметическое Расширение :
Арифметическое расширение позволяет оценить арифметическое выражение и заменить результат. Формат для арифметического расширения:
$((expression))
Выражение обрабатывается так, как если бы оно было в двойных кавычках, но двойные кавычки в скобках специально не обрабатываются. Все токены в выражении подвергаются раскрытию параметров, расширению строк, подстановке команд и удалению кавычек. Арифметические разложения могут быть вложенными.
$ a=1
$ b=2
$ echo $(( a+(b*2) ))
5
foo[123]
, который расширится foo1 foo2 foo3
, но в этом случае они должны быть именами файлов
Обычно это в моем скрипте запуска (.bashrc, .profile, что угодно)
shopt
Боже мой, проверьте комментарии:
shopt -s cdspell # try to correct typos in path
shopt -s dotglob # include dotfiles in path expansion
shopt -s hostcomplete # try to autocomplete hostnames
Псевдоним, который сохраняет нажатия клавиш:
mkdir
и cd
в него:
mkcd () { mkdir -p "$@" && cd "$@"; }
И последнее, но не менее важное: я разочаровался в запоминании синтаксиса tar, поэтому:
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
}
mkcd
только на то, что я называю id md
. Однако использование «$ @» в качестве аргумента для cd не имеет никакого смысла, так как вы не можете перейти к более чем одному каталогу. «$ @» будет работать для mkdir, но тогда вы по-разному обрабатываете аргументы для mkdir и cd, поэтому я бы предпочелmd () { mkdir -p "$1"; cd "$1" }
Две функции bash, которые спасают меня от множества нажатий клавиш.
Делать автоматически и ls после каждого успешного CD:
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
}
builtin foo
определив функцию cd
; Я использовал chdir
в своих функциях. Удобно
cd() { builtin cd -- "$@" && { [ "$PS1" = "" ] || ls -hrt --color; }; }
Поскольку я обычно на полпути в командную строку, прежде чем хочу искать (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
u
и o
стоять здесь?
setopt autopushd
и все изменения каталогов будут выполняться автоматически
screen
команда . Это в основном сохраняет ваш сеанс командной строки, когда вы вернетесь. Это своего рода менеджер терминалов, как менеджер окон. Таким образом, в одном терминальном сеансе вы можете использовать несколько виртуальных терминалов. Это очень круто.
Если вы используете screen
эту функцию оболочки (поместите в нее .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).
В zsh вы можете получить то же поведение, добавив это в .zshrc:
autoload edit-command-line
zle -N edit-command-line
bindkey '^X^e' edit-command-line
Если вы быстро печатаете, это пригодится:
alias grpe='grep --color=tty'
alias gpre='grep --color=tty'
alias rgep='grep --color=tty'
alias gerp='grep --color=tty'
Этот макрос помогает вам вычислить итоги столбца вывода: размеры файлов, байты, пакеты, все, что вам нужно сделать, это указать столбец, который вы хотите добавить:
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), вы можете восстановить терминал с помощью этой функции оболочки:
restaura ()
{
perl -e 'print "\e)B";'
}
Мне нравится, когда моя ls использует символы, чтобы различать класс файлов, а также скрывать файлы резервных копий, сгенерированные моим редактором (файлы резервных копий заканчиваются символом ~):
alias ls='ls -FB'
s/fast/sloppy/
reset
там, где вы используете restaura
.
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
bindkey -s '\e[12~' "sudo !!\n"
связывания (в данном случае) F2 для запуска этой команды. У меня есть такая привязка, поэтому, когда я что-то запускаю и вижу сообщение об ошибке «Вы забыли« sudo », дурак», я могу просто раздраженно нанести удар F2
Если команда принимает ввод stdin, вы можете прочитать ввод из файла с помощью <filename
. Это может появиться в любом месте команды, поэтому эти строки эквивалентны:
cat filename
cat <filename
<filename cat
Это особенно полезно для grep, так как позволяет поместить выражение в конец строки, поэтому вы можете быстро изменить команду grep, нажав Upбез необходимости прокрутки влево, чтобы пройти имя файла:
<filename grep 'expression'
<input foo | bar | baz >output
, она не будет работать, если вы попытаетесь смешать некоторые примитивы циклической оболочки, такие как while
или for
в середине. Так что я сдался и просто поставил его в конце, как это принято.
Вы можете использовать CDPATH
для установки каталога эквивалент PATH
; если вы попытаетесь, cd foo
а foo
в текущем каталоге его нет, оболочка проверит, CDPATH
ищет ли каждый из каталогов foo
в них и переключится на первый найденный каталог :
export CDPATH="/usr"
cd bin # switches to 'bin' if there is one in the current directory, or /usr/bin otherwise
vi `which scriptname`
Потому что, когда ты не знаешь, где что-то живет, тебе тоже все равно.
which
автоматического вызова , поэтомуvi =scriptname
$(scriptname)
Амперсанд . Это помещает вашу команду в фоновый режим, так что вы можете продолжить печатать.
$> sudo updatedb &
Работая вместе, и через некоторое время вы видите:
[1] 17403
И ваш процесс завершен! Отлично подходит для вещей, где вам не нужно ждать их окончания.
&!
фоновое задание и откажись от него!
bash
.
nohup
этим выполняет.
Завершение вкладки . Насколько плохо было бы отстой, если бы вам пришлось печатать все символы каждого пути?
rm -fr /
. Так что да, завершение Таба очень важно ...
ls /usr/lib/game-d*/rott*
rm -rf /
отключен в большинстве систем Linux?
Размонтировать последнее подключенное устройство:
mount /media/whatever
...
u!mo
!mo
расширяется до последней команды, которая началась с mo
(по крайней мере, в bash). Иногда это mv
происходит посередине, поэтому u!m
работать не так часто.
У меня есть это в моем .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]"
}
И когда у меня есть исходный код HTML в буфер обмена и хочу найти все ссылки, которые я использую
c-v | find-all 'href="([^"]*)"' | c-c
И у меня есть все URL в буфер обмена
У меня тоже есть эта функция
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()))";
}
с помощью этой функции я могу рассчитать произведение или сумму аргументов.
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()))";
}
Это полезная функция, которая разделяет стандартный ввод, разделенный регулярным выражением, и затем объединяет результат.
function factorial() {
seq -s* $1 | bc
}
факторная функция
function wiki() { dig +short txt $1.wp.dg.cx; }
Эта функция отображает текст вики над DNS
У меня также есть три функции цвета
function blue() {
echo -e "\x1b[34m\x1b[1m"$@"\x1b[0m";
}
function green() {
echo -e "\x1b[32m\x1b[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)"; }
Вы можете распечатать все сообщения с
alias all-errors='for i in `seq 131`; do echo -n "$i: "; strerror $i; done'
Еще один полезный трюк ZSH:
Рассматривать вывод команды как файл:
emacs =(hg cat -r 100 somefile)
Это открывает старую версию отслеживаемого Mercurial файла в emacs для просмотра с подсветкой синтаксиса. Без этого я бы возиться с hg revert
, hg archive
или явно отправитьhg cat
вывод во временный файл.
Конечно, это работает с любой программой, которая открывает файлы, и любой программой, которая печатает на стандартный вывод.
Специфичной для ZSH функцией является псевдонимы суффиксов, которые устанавливаются с alias
помощью -s
флага:
alias -s ext=program
Если у данного расширения есть псевдоним суффикса, вы можете выполнить файл с этим расширением напрямую, и ZSH запустит данную программу и передаст имя файла в качестве аргумента. Так что, если вышеупомянутый псевдоним действует, эти строки эквивалентны:
/path/to/foo.ext
program /path/to/foo.ext
Одна из моих самых любимых функций ZSH - это каталоги. Вы можете экспортировать переменную с заданным именем, со значением, указывающим на определенный путь:
export foo=/usr/bin
Теперь вы можете использовать ~foo
в команде для ссылки на /usr/bin
:
cd ~foo
~foo/ls
cat ~foo/filename
Смотрите этот вопрос .
Когда вы бежите ps ax | grep string
:
[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
что-то немного раздражающее
Вы можете избавиться от этого, запустив 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
обновить : или просто запуститьpgrep string
'[o]penbox'
). Скобки будут работать как глобус, так что если в вашем каталоге есть openbox (скажем, вы находитесь /usr/bin
), bash просто использует openbox, что предотвратит трюк с grep.
Команда бездействия, :
как в
while :; do :; done
Расширение раскоса в сочетании с петлями для:
for c in {1..3}; do :; done
!
оператор и операторы короткого замыкания ||
и&&
[ -d /tmp/dir ] || mkdir /tmp/dir
if ! ping 34.41.34.1; then :; fi
использование вложенных оболочек вместо pop / push (удобно в скриптах)
~$ ( 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
~$
и мой любимый: перенаправление на список команд
{ w; ps; ls /tmp; } 2>/dev/null |less
Я люблю бросать столько вещей, сколько я могу в мою PS1. Несколько полезных вещей для запоминания:
\e[s
и \e[u
сохранить и отменить сохранение позиции курсора соответственно. Я использую это для создания «информационной панели» в верхней части экрана, длиной в пару строк, которая может вместить больше материала. Пример:
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[2J\n"'
. Попробуйте!
Кроме того, PROMPT_COMMAND
переменная определяет команду для выполнения перед PS1 каждый раз.
Еще одна bg
команда. Если вы забыли поставить &
в конце команду, просто нажмите ^Zи введите bg
, и она работает в фоновом режиме.
bg
, что когда у меня программа работает в фоновом режиме и случайно fg
нажимаю, я не знаю, как отодвинуть ее назад: D
PS1
поэтому я помещаю большую часть того, что хочу, в нижнюю строку экрана ...