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

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 программа также полезна. Помимо печати таблицы, он позволяет запрашивать один или несколько отдельных символов.
Мэтью Флэшен
46

Выполните последнюю команду от имени пользователя root:

sudo !!
Алекс Б
источник
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
}
sygo
источник
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
}
Maik
источник
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
jacksonh
источник
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'
оборота miguel.de.icaza
источник
Не забывайте: 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
Eimantas
источник
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

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

user394
источник
11
И если ваше приложение имеет графический интерфейс, вы, вероятно, не хотите, чтобы оно оставалось на рабочих местах. Добавь &!фоновое задание и откажись от него!
unperson325680
@progo: Это не работает для меня bash.
Натан Осман
@George. Кажется, ты прав. Я узнал, что zsh поддерживает это, и позже я услышал, что bash также поддерживает это. Боже мой :(
unperson325680
1
@progo: Оказывается, что предварительная команда с nohupэтим выполняет.
Натан Осман
8

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

user394
источник
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'
jcubic
источник
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
оборота artistoex
источник
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поэтому я помещаю большую часть того, что хочу, в нижнюю строку экрана ...
Джош