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


93

Поделитесь своими возможностями и приемами командной строки для Unix / Linux. Старайтесь, чтобы это не зависело от оболочки / дистрибутива, если это возможно. Интересует просмотр псевдонимов, однострочников, сочетаний клавиш, небольших сценариев оболочки и т. Д.

Ответы:


88

Это несколько расширяет !!трюк, упомянутый в этом ответе . На самом деле есть куча связанных с историей команд, о которых обычно забывают (люди, как правило, наносят удар 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

3
И если вы используете Bash (может быть то же самое для некоторых других оболочек), M- ^ (Meta- ^) расширяет вышеупомянутые операторы расширения истории, на тот случай, если вы хотите увидеть, что вы на самом деле имеете в виду к.
Эрик Смит

1
Я никогда не нашел применение для! командовать вещами. Мне кажется плохим выполнение команды, которую я не вижу. Было бы так легко набрать! -3 вместо! -4, и кто знает, что может произойти. Поиск номера строки команды, которую я хочу выполнить, обычно более труден, чем стоит. Прикольные трюки, но я никогда не нашел для них реального применения.
Фальмарри

1
@Falmarri Я никогда не использую !-#те. Я использую !stringдля запуска последнюю команду, которая начинается со строки, но я обычно завершаю ее сначала (zsh), чтобы убедиться, что я правильно запускаю
Майкл Мрозек

1
Нет! :) "Запуск !Nбудет запускать команду ..." - это слишком узкое описание; собственно, !Nбудет подставлена ​​команда ...; и так далее для всех описаний в ответе. Более корректно и открывает гораздо больше полезных возможностей! Например, упомянутое sudo !!.
imz - Иван Захарящев

1
Для запуска предыдущих команд с поиском по строке я обычно просто нажимаю Ctrl-R. Несколько Ctrl-R будут копать глубже в истории. Таким образом, я сразу вижу найденную команду и могу отменить ее и посмотреть дальше. Ctrl-G выходит из этого режима. Единственное неудобство в том, что Ctrl-R предназначен для bash; в Emacs, чтобы просмотреть историю команд и значений ввода (для Mx или других значений чтения), вместо этого используется Meta-R (Meta-R также используется eshellв Emacs). Поэтому я часто путаю их.
imz - Иван Захарящев

64

bash - вставить последний параметр предыдущей строки

alt-. самая полезная комбинация клавиш, попробуйте и посмотрите, почему-то никто не знает об этом.

нажмите ее снова и снова, чтобы выбрать более старые последние параметры.

замечательно, когда вы хотите сделать что-то еще с аргументом / файлом, который вы использовали только минуту назад.


11
Вы также можете использовать! $ Для ссылки на последний аргумент в предыдущей команде. Это полезно, потому что работает как в сценариях, так и в интерактивном режиме. (Работает в bash & zsh)

4
Каждый раз, когда вы нажимаете alt- .он будет переходить к предыдущей команде и извлекать из нее последний аргумент. Так что если вы хотите последний аргумент из трех команд назад, просто нажмите alt- .три раза.
Кли

2
Это связывание ключей по умолчанию для команды yank-last-argreadline, поэтому она должна работать с любой программой, связанной с readline, а не только с BASH или ZSH.
Джеймс Снерингер

В режиме vi мне пришлось перепривязать yank-last-arg согласно этому ответу: superuser.com/questions/18498/…
Jeromy Anglim

В xterm, meta-. производит ®, но вы можете использовать esc вместо meta (обычно в bash), так что esc-. вместо.
Дероберт

49

Мой любимый

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 .

Вы также можете посмотреть эти четыре статьи Петериса Круминьша в его блоге.


2
Отдельная ascii программа также полезна. Помимо печати таблицы, он позволяет запрашивать один или несколько отдельных символов.
Мэтью Флэшен


42

Не уверен, что это считается «уловкой», но люди, похоже, очень не знают о стандартных горячих клавишах readline. Особое применение в оболочках:

  • Ctrl+ U- вырезать текущую строку
  • Ctrl+ Y- Вставить отрезок с помощью Ctrl+U
  • Ctrl+ L- Очистить экран и перерисовать текущую строку
  • Ctrl+ G- Получить новую строку и отказаться от текущей

5
Просто добавьте несколько к ним: Ctrl + A, чтобы перейти к началу строки, Ctrl + E, чтобы перейти к концу строки, Ctrl-K, чтобы стереть от курсора до конца строки.
rsuarez

Ctrl+Lсоответствует символу FormFeed ascii. Обычно он перерисовывает экран в текстовых приложениях с помощью экранного окна (например, vim, less, mc и т. Д.). Хорошо, если экран был «загрязнен» каким-то выводом из другой программы.
Хловдал

Добавление в список горячих клавиш: Ctrl+Wразрезать одно слово назад, Alt+Fперейти вперед на одно слово, Alt+Bперейти на одно слово назад в строке. Мне нравится, Ctrl+Yи Shift+Insertпотому что вы можете иметь две скопированные строки. Один с помощью Ctrl+U(вставьте его Ctrl+Y), и в то же время вы можете скопировать другое слово (выделить строку) вставить с ( Shift+Insert).

36

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"
}

Просто пара. Я могу опубликовать гораздо больше позже, должен вернуться к работе!


8
alias mk=makeБыстрее печатать и меньше вероятность ошибиться. Или скомпилируйте из своего редактора, используя горячую клавишу ...
Ларс Хаугсет

Кстати, Zsh имеет встроенную коррекцию орфографии, которая очень хороша для исправления простых опечаток.
Адам Быртек,

Также в zsh, я думаю, что по умолчанию, когда вы нажимаете клавишу «вверх», он выполняет поиск в истории, как если бы вы нажали ctrl r. Может быть не по умолчанию, но это настройка.
Фальмарри

Я бы рассмотрел alias m=make, или даже m=make -j6или подобное - за исключением того, что я уже использую alias m=mutt
jmtd

31

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

diff <(ls dir1) <(ls dir2)

Это также очень полезно, commпоскольку требует только файлы, но во многих случаях это пустая трата inode.
Марчин

30

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

cd -

Я говорю вам, cd..от DOS укоренилась в моей мышечной памяти ...
LawrenceC

Это дешевая версия pushd и popd, хотя ...
Роберт Массайоли

Точно так же есть cd(без аргументов), который приведет вас в ваш домашний каталог.
Мэй

Да, это безумие. Где в справочной странице показано расширение '-'? Я всегда пытаюсь (и забываю) использовать pushd / popd
Chuck R

29

Расширение скобки :

Разбивка скобок - это механизм, с помощью которого можно генерировать произвольные строки.

Это позволяет заменить утомительные строки, такие как:

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

3
Хорошо, я не могу поверить, что я забыл об этом. Есть также более компактный вариант foo[123], который расширится foo1 foo2 foo3, но в этом случае они должны быть именами файлов
Майкл Мрозек

хе-хе .. спасибо ... учиться чему-нибудь каждый день +1
Стефан

29

Обычно это в моем скрипте запуска (.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
}

5
+1, почему я не подумал об этом? (выдержка)
МАК

У меня есть функция, похожая mkcdтолько на то, что я называю id md. Однако использование «$ @» в качестве аргумента для cd не имеет никакого смысла, так как вы не можете перейти к более чем одному каталогу. «$ @» будет работать для mkdir, но тогда вы по-разному обрабатываете аргументы для mkdir и cd, поэтому я бы предпочелmd () { mkdir -p "$1"; cd "$1" }
hlovdal

как мне добавить эти команды? просто вставить как .bashrc или добавить "псевдоним" перед ними?
Асаф

21

Две функции 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
}

4
Я никогда не понимал, что вы можете обойтись, builtin fooопределив функцию cd; Я использовал chdirв своих функциях. Удобно
Михаил Мрозек

Потрясающие. Просто добавьте -F к ls в функции cd, и это идеально (для меня)!
торжественно

2
Я делаю то же самое, что и вы, для компакт-диска, но у меня есть еще несколько проверок cd() { builtin cd -- "$@" && { [ "$PS1" = "" ] || ls -hrt --color; }; }
работоспособности

17

Поскольку я обычно на полпути в командную строку, прежде чем хочу искать (CTRL-R в bash), у меня есть следующее .bashrc

bind '"\e[A"':history-search-backward
bind '"\e[B"':history-search-forward

Это означает, что если я ввожу cd, затем нажимаю вверх / вниз, я вижу все опции, к которым у меня есть cd'd. В основном я использую это для часто используемых dirs. Как "CD W", и я в конечном итоге пройти через все рабочие пространства, которые я использую много.


Это действительно здорово! Это расширяет поведение стрелок, не нарушая их основной функциональности. Спасибо!
philfr

17

Одна вещь, которая экономит мне много времени, это команды pushd / popd. Эти ребята позволяют вам создавать стопку каталогов и значительно сокращают количество набираемых текстов:

/foobar/ > pushd /src/whatever/foo/test
/foobar/src/whatever/foo/test > make run
/foobar/src/whatever/foo/test > popd
/foobar/ > make

2
Да! псевдоним u = pushd; псевдоним o = popd
cannedprimates

2
.. и что делать uи oстоять здесь?
Деизель

@deizel: Ничего конкретного, просто ярлык, чтобы не печатать.
Адам Быртек

2
Похоже, вторая буква команды, так как они оба начинаются с p, вы не можете использовать это для обоих.
кураж

В ZSH вы можете setopt autopushdи все изменения каталогов будут выполняться автоматически
Майкл Мрозек

14

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он проверит, существует ли ваш основной сеанс, и подключится к нему. В противном случае это создаст его.


технически, это собственная программа, а не «команда».
unperson325680

1
Я бы порекомендовал tmux или dvtm поверх экрана. Они более современные и более чистые замены.
Дельтарай

Да, «tmux», несомненно, намного лучше, чем screen.
ColinM

Это также более точно следует соглашению Unix об интуитивных сокращенных именах :)
user394

13

Если вам нужно отредактировать особенно длинную командную строку в 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 

Вау, это входит в Книгу.
10

Да, и в мои заметки!
Jyz

12

Если вы быстро печатаете, это пригодится:

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'

Не забывайте: alias gerp = 'grep --color = tty' Я делаю это все время ;-)
Роберт Суишер

1
Насколько я понимаю, «быстрый» не считается, если я не точен. Вы также можете посмотреть на переменные GREP_COLORS и GREP_OPTIONS.
Энди Лестер

2
s/fast/sloppy/
Джош

1
Я использую resetтам, где вы используете restaura.
JMTD

11
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

2
Если вы используете ZSH, вы можете сделать что-то вроде bindkey -s '\e[12~' "sudo !!\n"связывания (в данном случае) F2 для запуска этой команды. У меня есть такая привязка, поэтому, когда я что-то запускаю и вижу сообщение об ошибке «Вы забыли« sudo », дурак», я могу просто раздраженно нанести удар F2
Майкл Мрозек

Плохой ключ F2 ....)
Eimantas

Я использую это все время. Я постоянно забываю набрать sudo перед редактированием моего файла hosts. Если это произойдет, я просто запускаю sudo !! +1
Брайан Виггинтон

10

Если команда принимает ввод stdin, вы можете прочитать ввод из файла с помощью <filename. Это может появиться в любом месте команды, поэтому эти строки эквивалентны:

cat filename
cat <filename
<filename cat

Это особенно полезно для grep, так как позволяет поместить выражение в конец строки, поэтому вы можете быстро изменить команду grep, нажав Upбез необходимости прокрутки влево, чтобы пройти имя файла:

<filename grep 'expression'

3
Хороший совет! Стоит отметить, что это на самом деле не переупорядочивает аргументы команды. Вместо этого он направляет файл в STDIN процесса, поскольку grep теперь не имеет аргумента файла, по умолчанию он читает из STDIN. Понимание этого откроет много возможностей использовать эту технику с другими командами, а также поможет людям понять, что происходит, когда все работает не так, как ожидалось. Для получения дополнительной информации ищите каналы и редиректоры: dsj.net/compedge/shellbasics1.html
chillitom

@chill Хорошие очки; наконечник был сформулирован так плохо, что был по сути неправильным. Я переписал его на основе вашего комментария
Майкл Мрозек

Что-то, что я обнаружил недавно: вы можете перенаправить ввод в циклы (для, пока и т. Д.). См. Faqs.org/docs/abs/HTML/redircb.html .
Лукас Джонс

Условно вы кладете перенаправление на конец. Хотя метафора конвейера выглядит лучше <input foo | bar | baz >output, она не будет работать, если вы попытаетесь смешать некоторые примитивы циклической оболочки, такие как whileили forв середине. Так что я сдался и просто поставил его в конце, как это принято.
JMTD

@jmtd Ну, если поставить его в конец, то это исключает "Это особенно полезно для grep, так как позволяет поместить выражение в конец строки, поэтому вы можете быстро изменить команду grep, нажав Up, без необходимости прокрутки осталось пройти мимо имени файла »
Михаил Мрозек

9

Вы можете использовать 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

3
Это может вызвать проблемы. См. Softpanorama.org/Scripting/Shellorama/cdpath.shtml "Если установлено значение $ CDPATH, встроенный в cd не будет неявно добавлять к нему текущий каталог. Это означает, что cd не будет выполнен, если из какого-либо действительного имени каталога не может быть создано записей в $ CDPATH, даже если в текущем каталоге есть каталог с тем же именем, что и имя, указанное в качестве аргумента для cd. " Я был укушен этим, некоторые Makefile перестал работать. Добавление явно может помочь, хотя, но есть и некоторые проблемы с этим.
ustun

9
vi `which scriptname`

Потому что, когда ты не знаешь, где что-то живет, тебе тоже все равно.


8
Я не хочу продолжать использовать функции ZSH, но я продолжаю думать о них так, как другие люди отвечают :). В ZSH вы можете сделать = foo для whichавтоматического вызова , поэтомуvi =scriptname
Майкл Мрозек

Если у вас возникли проблемы с поиском символа обратного хода, вы также можете использовать его$(scriptname)
Патрик

9

Амперсанд . Это помещает вашу команду в фоновый режим, так что вы можете продолжить печатать.

$> sudo updatedb &

Работая вместе, и через некоторое время вы видите:

[1] 17403

И ваш процесс завершен! Отлично подходит для вещей, где вам не нужно ждать их окончания.


11
И если ваше приложение имеет графический интерфейс, вы, вероятно, не хотите, чтобы оно оставалось на рабочих местах. Добавь &!фоновое задание и откажись от него!
unperson325680

@progo: Это не работает для меня bash.
Натан Осман

@George. Кажется, ты прав. Я узнал, что zsh поддерживает это, и позже я услышал, что bash также поддерживает это. Боже мой :(
unperson325680

1
@progo: Оказывается, что предварительная команда с nohupэтим выполняет.
Натан Осман

8

Завершение вкладки . Насколько плохо было бы отстой, если бы вам пришлось печатать все символы каждого пути?


5
Там самоубийство Linux. Если вы неправильно набрали команду - она ​​делает rm -fr /. Так что да, завершение Таба очень важно ...
Eimantas

Не так плохо, как вы думаете (но все же плохо), вы просто разбрасываете символы подстановки везде:ls /usr/lib/game-d*/rott*
jmtd

@Eimantas Не rm -rf /отключен в большинстве систем Linux?
Бернхард Хейстек

@phycker - я упомянул Suicide Linux, а не "все".
Эймантас

7

Размонтировать последнее подключенное устройство:

mount /media/whatever
...
u!mo

!moрасширяется до последней команды, которая началась с mo(по крайней мере, в bash). Иногда это mvпроисходит посередине, поэтому u!mработать не так часто.


Используйте Ctrl + Shift + 6 (Ctrl + ^), чтобы развернуть команду, не выполняя ее в качестве меры предосторожности
ColinM

7

У меня есть это в моем .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'

6

Еще один полезный трюк ZSH:

Рассматривать вывод команды как файл:

emacs =(hg cat -r 100 somefile)

Это открывает старую версию отслеживаемого Mercurial файла в emacs для просмотра с подсветкой синтаксиса. Без этого я бы возиться с hg revert, hg archiveили явно отправитьhg cat вывод во временный файл.

Конечно, это работает с любой программой, которая открывает файлы, и любой программой, которая печатает на стандартный вывод.


5
Вы можете сделать это в bash с помощью <()
ScaryAardvark

5

Специфичной для ZSH функцией является псевдонимы суффиксов, которые устанавливаются с aliasпомощью -sфлага:

alias -s ext=program

Если у данного расширения есть псевдоним суффикса, вы можете выполнить файл с этим расширением напрямую, и ZSH запустит данную программу и передаст имя файла в качестве аргумента. Так что, если вышеупомянутый псевдоним действует, эти строки эквивалентны:

/path/to/foo.ext
program /path/to/foo.ext

Это одна вещь, которую мне действительно не хватало в Windows ... пока я не понял, что "программа" всегда была emacs, поэтому я перестал использовать shell для открытия файлов и просто использовал Cx Cf (duh).
Harpo

5

Одна из моих самых любимых функций ZSH - это каталоги. Вы можете экспортировать переменную с заданным именем, со значением, указывающим на определенный путь:

export foo=/usr/bin

Теперь вы можете использовать ~fooв команде для ссылки на /usr/bin:

cd ~foo
~foo/ls
cat ~foo/filename

если ваша подсказка отображает текущий рабочий каталог, то, насколько я помню, там также будут использоваться имена переменных.
Андре Хольцнер

4

Смотрите этот вопрос .

Когда вы бежите 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


да, очень полезно Вы должны процитировать openbox, хотя ( '[o]penbox'). Скобки будут работать как глобус, так что если в вашем каталоге есть openbox (скажем, вы находитесь /usr/bin), bash просто использует openbox, что предотвратит трюк с grep.
Rich Homolka

4
  • Команда бездействия, :как в

    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

3

Я люблю бросать столько вещей, сколько я могу в мою 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
phunehehe

Мне нравится чистка, PS1поэтому я помещаю большую часть того, что хочу, в нижнюю строку экрана ...
Джош
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.