Какой твой самый любимый трюк в командной строке, использующий Bash? [закрыто]

156

Мы все знаем, как использовать <ctrl>-Rдля обратного поиска в истории, но знаете ли вы, что вы можете использовать <ctrl>-Sдля пересылки поиска, если вы установите stty stop ""? Кроме того, вы когда-нибудь пробовали запустить bind -p, чтобы увидеть все ваши сочетания клавиш в списке? В Mac OS X по умолчанию более 455.

Какой ваш самый любимый неясный трюк, сочетание клавиш или конфигурация магазина с использованием bash?

Роберт Харви
источник
2
Пожалуйста, перефразируйте это, чтобы сказать: «Какой твой самый любимый»? Это позволяет людям голосовать за конкретные ответы, почти как опрос.
SCdF
> Пожалуйста, перефразируйте это, чтобы сказать: «Какой твой самый любимый»? Готово.
Мартин Клинке
1
Существует клон StackOverflow для этого самого вопроса: commandlinefu.com
РКБ
Только 232 из этих 455 привязок клавиш по умолчанию делают что-то кроме «self-insert» («введите этот ключ»): $ bind -p | grep -v self-insert | wc
Эд Браннин
Здесь есть кое-что изящное. Но следует отметить, что довольно многие из них работают только тогда, когда bash находится в режиме emacs ...
Mo.

Ответы:

157

Быстрое переименование / перемещение файлов с суффиксами:
cp /home/foo/realllylongname.cpp{,-old}

Это расширяется до:
cp /home/foo/realllylongname.cpp /home/foo/realllylongname.cpp-old

user10765
источник
12
Потрясающие! Теперь мне нужно попытаться запомнить это.
Джон Эриксон
9
Просто чтобы указать, что для обратного (переход от .cpp-old к .cpp) вы должны выполнить cp /home/foo/realllylongname.cppabilities-old,}
Майкл
Это очевидно в ретроспективе, и все же я не думаю, что не забуду сделать это самостоятельно. Спасибо!
Zecc
150
cd -

Это командная строка, эквивалентная кнопке «Назад» (переводит вас в предыдущий каталог, в котором вы находились).

Марк Бик
источник
6
Я предпочитаю использовать pushdи popdподдерживать стек каталогов самостоятельно.
Алекс М
21
Но «cd -» имеет преимущество в работе, даже если вы не помните использовать pushd.
Серхио Акоста,
10
Стоит отметить, что «cd» перенесет вас в ваш домашний каталог.
Др-Ян
Интересно, что это не отображается в man cdили, cd --help(по крайней мере, мой).
Халил Озгюр
135

Еще один любимый:

!!

Повторяет вашу последнюю команду. Самое полезное в виде:

sudo !!
amrox
источник
81
у этого есть дополнительное преимущество, заставляющее Вас казаться действительно сердитым об этом также. "Компьютер, сделай это." "В доступе отказано". "СДЕЛАЙ ЭТО!!"
nickf
Это не мало известно! :-)
хойхой
10
Подобные вещи, которые вы можете сделать: mkdir testdir; cd !$.. Это работает cd [last word of previous line](в примере cd testdir)
dbr
13
Сделай мне бутерброд судо!
Кибби
Если вам нравятся !!,! $ И! -1: ^ foo ^ bar, вы также "связываете Space: magic-space". stackoverflow.com/questions/603696/...
Yoo
81

Мой фаворит - '^ string ^ string2', который принимает последнюю команду, заменяет строку на string2 и выполняет ее

$ ehco foo bar baz
bash: ehco: command not found
$ ^ehco^echo
foo bar baz

Руководство по истории командной строки Bash

сет
источник
Это не жадный. Как мне сделать это жадным?
Altreus
9
!!:gs/ehco/echo/
andre-r
2-я страница этого руководства очень важна
jmoz
1
@ Андрэ-р: !!:gs/ehco/echo/выполняет глобальный поиск и замену на последней команды (совещается !!в stackoverflow.com/questions/68372/... ). Это не эквивалентно тому, ^ehco^echoчто просто заменяет один экземпляр «ehco» - более точный ответ будет !!:s/ehco/scho.
Iceland_jack
64

переименование

Пример:

$ ls
this_has_text_to_find_1.txt
this_has_text_to_find_2.txt
this_has_text_to_find_3.txt
this_has_text_to_find_4.txt

$ rename 's/text_to_find/been_renamed/' *.txt
$ ls
this_has_been_renamed_1.txt
this_has_been_renamed_2.txt
this_has_been_renamed_3.txt
this_has_been_renamed_4.txt

Так полезно

Jiaaro
источник
3
Ух ты, все эти годы я был дебилом, используя для этого трюки basename, mv и {}. / foreheadsmack.
Грегг Линд
7
переименование не является специфичным для bash / readline, как и другие посты.
оружие
1
zmv из zsh намного лучше в большинстве случаев.
ZyX
У util-linux-ng также есть команда переименования, и она не похожа на ту, что упомянута в этом ответе. Команда, описанная здесь, на самом деле mmv .
Кристиан Чупиту
60

Я фанат !$, !^и !*expandos, возвращаясь из самых последних представлены в командной строке: последний пункт, первый пункт без команды, и все непищевых команды. Для остроумия (обратите внимание, что оболочка сначала выводит команду):

$ echo foo bar baz
foo bar baz
$ echo bang-dollar: !$ bang-hat: !^ bang-star: !*
echo bang-dollar: baz bang-hat: foo bang-star: foo bar baz
bang-dollar: baz bang-hat: foo bang-star: foo bar baz

Это очень удобно , когда вы, скажем ls filea fileb, и хотите редактировать один из них: vi !$или оба из них: vimdiff !*. Его также можно обобщить до « nаргумента th» следующим образом:

$ echo foo bar baz
$ echo !:2
echo bar
bar

Наконец, с путевыми именами вы можете добраться до частей пути, добавив :hи :tк любому из вышеупомянутых расширений:

$ ls /usr/bin/id
/usr/bin/id
$ echo Head: !$:h  Tail: !$:t
echo Head: /usr/bin Tail: id
Head: /usr/bin Tail: id
Пи.
источник
'echo !! 2' не работал для меня, и из более позднего поста я увидел, что, по-моему, это должно быть: 'echo!: 2'
user13060
8
добавьте "bind Space: magic-space" в .bashrc и любой другой! комбинация будет автоматически расширена, когда вы нажмете пробел.
Yoo
47

При выполнении команд иногда я хочу запустить команду с предыдущими аргументами. Для этого вы можете использовать этот ярлык:

$ mkdir /tmp/new
$ cd !!:*

Иногда вместо использования find я разрываю однострочный цикл, если мне нужно выполнить несколько команд в списке файлов.

for file in *.wav; do lame "$file" "$(basename "$file" .wav).mp3" ; done;

Настройка параметров истории командной строки в моем .bash_login (или .bashrc) действительно полезна. Ниже приведен список настроек, которые я использую на своем Macbook Pro.

Установка следующего делает bash erase дублирующимися командами в вашей истории:

export HISTCONTROL="erasedups:ignoreboth"

Я также значительно увеличил размер своей истории. Почему нет? Кажется, это не замедляет работу современных микропроцессоров.

export HISTFILESIZE=500000
export HISTSIZE=100000

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

export HISTIGNORE="&:[ ]*:exit"

Вы определенно хотите установить гистапенд. В противном случае, bash перезаписывает вашу историю при выходе.

shopt -s histappend

Другой вариант, который я использую, это cmdhist. Это позволяет сохранять многострочные команды в истории как одну команду.

shopt -s cmdhist

Наконец, в Mac OS X (если вы не используете режим vi) вам нужно сбросить <CTRL> -S с остановки прокрутки. Это не позволяет bash интерпретировать его как прямой поиск.

stty stop ""
hoyhoy
источник
6
Я нахожу "Альт". намного лучше, чем «!!: *» для повторения последнего слова последней команды.
Weidenrinde
Дополнения для истории: 1. регулярно сохраняйте историю (с -a, если у вас открыто сразу несколько оболочек) export PROMPT_COMMAND = "history -a" 2. Псевдоним для чтения истории из других оболочек. псевдоним - h = 'history -n; история | grep '
Weidenrinde
экспорт HISTIGNORE = "[] *" не требуется, так как ваш HISTCONTROL = ignoreboth должен делать то же самое
Weidenrinde
Еще одна приятная вещь для истории: экспорт HISTTIMEFORMAT = "% Y-% m-% d% H:% M:% S:"
Weidenrinde
Чтобы сэкономить несколько нажатий клавиш "cd !!: *", попробуйте "cd! $". «! $» Будет интерпретироваться как последний аргумент вашей последней команды.
Тим Стюарт
43

Как вывести список только подкаталогов в текущем?

ls -d */

Это простой трюк, но вы не знаете, сколько мне нужно времени, чтобы найти его!

edomaur
источник
2
Превосходно! Все эти годы лучшее, что я мог придумать, было то alias lsd='ls -F | grep --color /', что перечисляло бы то же самое, но в более отстойной форме. Тем не менее, для простоты синтаксического анализа будет указываться один каталог в строке. Я изменил вашу команду, чтобы сделать то же самое:ls -d1 */
Артем Руссаковский
как это работает? "ls -d" списки просто. (что странно) но "ls -d * /" работает.
Yoo
1
Это немного сложно ... "ls -d" похож на "ls -d ./" и "ls -d /" на "ls -d ./*/". Параметр '-d' устанавливает 'ls', чтобы перечислять только записи каталога, но если вы не укажете ему параметр, он будет использовать текущий каталог в качестве параметра, поэтому он имеет * только "." каталог к ​​списку ...
edomaur
1
Я не могу поверить, что я никогда не обнаруживал это раньше. Отличный совет.
Ник Диксон
Слов нет, просто вау !!! :)
Димба
41

ESC.

Вставляет последние аргументы из вашей последней команды bash. Это пригодится больше, чем вы думаете.

cp file /to/some/long/path

CD ESC.

amrox
источник
Это работает для меня (Баш). Обратите внимание, что вы нажали клавишу Esc, а затем клавишу точки. Нет дефиса или чего-то еще.
Howler
9
Также alt-. это то же самое.
Марк Бейкер
Да, это только Bash. Но <esc> (или Alt- или Meta-) _ привязан к той же функции, и <esc> -_ также работает в режиме vi.
Ник Диксон
@hendry в моем Zsh это на самом деле работает. Может быть, вы используете режим vi?
ZyX
Используйте тег kbd для нажатия клавиш: <kbd> ESC </ kbd> (но не очень хорошо сочетается с форматированием кода / отступом).
пользователь неизвестен
36

Конечно, вы можете " diff file1.txt file2.txt", но Bash поддерживает подстановку процессов , что позволяет вам diffвыводить команды.

Например, скажем, я хочу убедиться, что мой скрипт дает мне ожидаемый результат. Я могу просто обернуть свой скрипт в <() и передать его, diffчтобы получить быстрый и грязный юнит-тест:

$ cat myscript.sh
#!/bin/sh
echo -e "one\nthree"
$
$ ./myscript.sh 
one
three
$
$ cat expected_output.txt
one
two
three
$
$ diff <(./myscript.sh) expected_output.txt
1a2
> two
$

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

$ diff <(ssh server1 'rpm -qa | sort') <(ssh server2 'rpm -qa | sort')
241c240
< kernel-2.6.18-92.1.6.el5
---
> kernel-2.6.18-92.el5
317d315
< libsmi-0.4.5-2.el5
727,728d724
< wireshark-0.99.7-1.el5
< wireshark-gnome-0.99.7-1.el5
$

Дополнительные примеры приведены в Руководстве по расширенному написанию сценариев на http://tldp.org/LDP/abs/html/process-sub.html .

Филипп Дурбин
источник
35

Моя любимая команда "ls -thor"

Это вызывает силу богов перечислять самые последние измененные файлы в удобном для чтения формате.

user10109
источник
6
Напоминает мне еще одну, совершенно бесполезную, но также забавную команду ls -bart -simpson -ruls. S, ICNR
филипрем
'ls -tor' также полезен, так как вы можете быстро найти большие файлы. А также, оригинальное шведское написание имени бога грома на самом деле «Tor».
Дала
На датском языке вы можете использовать, ls -lortчто является датским словом «дерьмо». Пропускать любые группы и не получать гнев Вальхала :)
Джеспер Ренн-Йенсен
1
Можно также сказать это как «ls -lotr», который, по-видимому, имеет отношение к Толкину и Властелину Колец :)
ADEpt
28

Еще новинка, но она умная ...

Топ 10 используемых команд:

$ history | awk '{print $2}' | awk 'BEGIN {FS="|"}{print $1}' | sort | uniq -c | sort -nr | head

Пример вывода:

 242 git
  83 rake
  43 cd
  33 ss
  24 ls
  15 rsg
  11 cap
  10 dig
   9 ping
   3 vi
ctcherry
источник
1
Вот более короткая и быстрая версия:history | awk 'BEGIN {FS="[ \t]+|\\|"} {print $3}' | sort | uniq -c | sort -nr | head
Приостановлена ​​до дальнейшего уведомления.
25

^ R обратный поиск. Нажмите ^ R, введите фрагмент предыдущей команды, которую хотите сопоставить, и нажимайте ^ R, пока не найдете нужную команду. Тогда мне не нужно помнить недавно использованные команды, которые все еще в моей истории. Не только bash, но также: ^ E для конца строки, ^ A для начала строки, ^ U и ^ K для удаления до и после курсора соответственно.

user10741
источник
2
Я никогда не могу вспомнить ^ U по какой-то причине. Разве нет слова удалить удалить ярлык тоже?
Хойхой
1
^ W удаляет слово перед курсором. (Не стесняйтесь редактировать свой ответ с этим.)
Джон Эриксон
2
^ R настолько полезен, что это было упомянуто в вопросе :)
Марк Бейкер
20

У меня часто есть псевдонимы для vi, ls и т. Д., Но иногда вы хотите избежать псевдонима. Просто добавьте обратную косую черту к команде впереди:

Например:

$ alias vi=vim
$ # To escape the alias for vi:
$ \vi # This doesn't open VIM

Круто, не правда ли?

Srikanth
источник
Вы также можете запустить - см. commandРуководство SHELL BUILTIN COMMANDSпо Bash.
Iceland_jack
17

Вот несколько настроек:

~/.inputrc:

"\C-[[A": history-search-backward
"\C-[[B": history-search-forward

Это работает так же, как и ^Rс использованием клавиш со стрелками. Это означает, что я могу напечатать (например), а cd /media/затем нажать стрелку вверх, чтобы перейти к последнему пункту, который я cdсделал внутри /media/папки.

(Я использую Gnome Terminal, возможно, вам придется изменить коды выхода для других эмуляторов терминала.)

Завершение Bash также невероятно полезно, но это гораздо более тонкое дополнение. В ~/.bashrc:

if [ -f /etc/bash_completion ]; then
    . /etc/bash_completion
fi

Это активирует завершение табуляции для каждой программы (например, попытка завершить табуляцию, когда начинается командная строка, evinceпокажет только те файлы, которые могут быть открыты, а также опции командной строки для завершения табуляции).

Хорошо работает с этим также в ~/.inputrc:

set completion-ignore-case on
set show-all-if-ambiguous on
set show-all-if-unmodified on
Поргес
источник
+1 bash_completion
круто
На Mac поиск по истории с помощью клавиш со стрелками можно включить с помощью: bind '"\ e [A"': привязка истории-поиска-назад '"\ e [B"': история-поиска-вперед
Asmus
17

Я часто использую следующее:

:pМодификатор напечатать результат истории. Например

!!:p

Напечатает последнюю команду, чтобы вы могли проверить ее правильность, прежде чем запускать ее снова. Просто войдите, !!чтобы выполнить это.

В том же духе:

!?foo?:p

Будет искать в вашей истории самую последнюю команду, содержащую строку 'foo', и печатать ее.

Если вам не нужно печатать,

!?foo

выполняет поиск и выполняет его сразу.

Стив Лейси
источник
2
Вместо использования: p, вы также можете использовать magic-space: stackoverflow.com/questions/603696/…
Yoo
расширить исторический контроль, не запуская магическое пространство в bashrcbind Space:magic-space # !pin<space>
SergioAraujo
16

У меня есть секретное оружие: ракушка.

Есть тысячи умных советов, классных трюков и эффективных рецептов, которые в большинстве случаев помещаются на одной строке.

Тот, который мне нравится (но я немного обманываю, поскольку использую тот факт, что Python теперь установлен в большинстве систем Unix):

alias webshare='python -m SimpleHTTPServer'

Теперь каждый раз, когда вы набираете «webshare», текущий каталог будет доступен через порт 8000. Очень удобно, когда вы хотите поделиться файлами с друзьями в локальной сети без USB-ключа или удаленного каталога. Потоковое видео и музыка тоже будут работать.

И, конечно, классическая вилочная бомба, которая совершенно бесполезна, но все же доставляет массу удовольствия:

$ :(){ :|:& };:

Не пытайтесь сделать это на производственном сервере ...

e-удовлетворительно
источник
Я думаю, что я не должен webshare /
Yoo
Я думаю, вы можете упростить команду до python -m SimpleHTTPServer(если я не
пропущу что-
Мех. На рабочем сервере эта вилочная бомба будет просто подавлена ​​ОС; Существуют ограничения на количество процессов, которые может создать любой пользователь.
Donal Fellows
3
@ Донал: Вы должны попробовать это и сообщить о своих выводах.
Майкл Фукаракис
12

Вы можете использовать команду watch вместе с другой командой для поиска изменений. Примером этого является то, что когда я тестировал свой маршрутизатор, я хотел получить последние цифры по таким вещам, как отношение сигнал / шум и т. Д.

watch --interval=10 lynx -dump http://dslrouter/stats.html
HFLW
источник
Команда смотреть действительно круто. Я впервые прочитал об этом в книге Linux Server Hacks около пяти лет назад. Кто знал, что это существует?
хойхой
11
Какое отношение «часы» имеют к bash?
Артем Руссаковский
11
type -a PROG

чтобы найти все места, где доступен PROG, обычно где-то в ~ / bin, а не в / usr / bin / PROG, чего можно было ожидать.

dajobe
источник
1
Он также скажет вам, если это функция или псевдоним. Если он в нескольких местах в вашем, PATHон покажет каждое из них.
Приостановлено до дальнейшего уведомления.
11

Мне нравится создавать команды с помощью echo и передавать их в оболочку:

$ find dir -name \*~ | xargs echo rm
...
$ find dir -name \*~ | xargs echo rm | ksh -s

Зачем? Потому что это позволяет мне посмотреть, что будет сделано, прежде чем я это сделаю. Таким образом, если у меня есть ужасная ошибка (например, удаление моей домашней директории), я могу ее перехватить до того, как это произойдет. Очевидно, это наиболее важно для разрушительных или безвозвратных действий.

Джон Эриксон
источник
1
Возможно, вы захотите использовать команды find -print0 и xargs -0, чтобы избежать проблем с файлами и папками с пробелами в них.
neu242
Или избегайте создания и работы с файлами и папками с пробелами в именах. ;-) Очевидно, что если вы работаете с пользовательскими именами, ваше предложение жизненно важно.
Джон Эриксон
4
Зачем вам добавлять «| ksh -s», когда вы можете просто удалить «echo»?
Yoo
Не надо трубу с GNU находить:$ find dir -name \\*~ -exec rm {} +
Боббого
10

При загрузке большого файла я часто делаю:

while ls -la <filename>; do sleep 5; done

А затем просто Ctrl + C, когда я закончил (или если lsвозвращает ненулевое значение). Это похоже на watchпрограмму, но вместо этого она использует оболочку, поэтому работает на платформах без watch.

Другим полезным инструментом является netcat, или nc. Если вы делаете:

nc -l -p 9100 > printjob.prn

Затем вы можете настроить принтер на другом компьютере, но вместо этого использовать IP-адрес компьютера, на котором работает netcat. Когда задание на печать отправляется, оно принимается компьютером, на котором запущен netcat, и помещается в него printjob.prn.

мечта
источник
Почему это, а не, например wget?
Porges
Попробуйте watch ls -la <filename>(используйте -n5, если вам не нравится значение по умолчанию 2 секунды).
Тед Персиваль
1
@Ted, watchдоступен не на всех платформах, таких как Solaris, Mac OS X и т. Д. @Porges, не знаю, что вы имеете в виду. Может ли wget также прослушивать порт?
Dreamlax
10

pushdи popdпочти всегда пригодится

jdt141
источник
10

Один из предпочтительных способов навигации, когда я использую несколько каталогов в совершенно разных местах в древовидной иерархии, - это использование acf_func.sh (указан ниже). После определения вы можете сделать

CD --

чтобы увидеть список последних каталогов, с числовым меню

кд -2

перейти ко второму последнему каталогу.

Очень прост в использовании, очень удобно.

Вот код:

# do ". acd_func.sh"
# acd_func 1.0.5, 10-nov-2004
# petar marinov, http:/geocities.com/h2428, this is public domain

cd_func ()
{
  local x2 the_new_dir adir index
  local -i cnt

  if [[ $1 ==  "--" ]]; then
    dirs -v
    return 0
  fi

  the_new_dir=$1
  [[ -z $1 ]] && the_new_dir=$HOME

  if [[ ${the_new_dir:0:1} == '-' ]]; then
    #
    # Extract dir N from dirs
    index=${the_new_dir:1}
    [[ -z $index ]] && index=1
    adir=$(dirs +$index)
    [[ -z $adir ]] && return 1
    the_new_dir=$adir
  fi

  #
  # '~' has to be substituted by ${HOME}
  [[ ${the_new_dir:0:1} == '~' ]] && the_new_dir="${HOME}${the_new_dir:1}"

  #
  # Now change to the new dir and add to the top of the stack
  pushd "${the_new_dir}" > /dev/null
  [[ $? -ne 0 ]] && return 1
  the_new_dir=$(pwd)

  #
  # Trim down everything beyond 11th entry
  popd -n +11 2>/dev/null 1>/dev/null

  #
  # Remove any other occurence of this dir, skipping the top of the stack
  for ((cnt=1; cnt <= 10; cnt++)); do
    x2=$(dirs +${cnt} 2>/dev/null)
    [[ $? -ne 0 ]] && return 0
    [[ ${x2:0:1} == '~' ]] && x2="${HOME}${x2:1}"
    if [[ "${x2}" == "${the_new_dir}" ]]; then
      popd -n +$cnt 2>/dev/null 1>/dev/null
      cnt=cnt-1
    fi
  done

  return 0
}

alias cd=cd_func

if [[ $BASH_VERSION > "2.05a" ]]; then
  # ctrl+w shows the menu
  bind -x "\"\C-w\":cd_func -- ;"
fi
Леонард
источник
10

Расширять сложные линии, прежде чем попасть в страшный ввод

  • Alt+ Ctrl+ e- shell-expand-line (может понадобиться Esc, Ctrl+ eна клавиатуре)
  • Ctrl+ _- отменить
  • Ctrl+ x, *- glob-expand-word

$ echo !$ !-2^ * Alt+ Ctrl+ e
$ echo aword someotherword * Ctrl+ _
$ echo !$ !-2^ * Ctrl+ x, *
$echo !$ !-2^ LOG Makefile bar.c foo.h

& Гр.

bobbogo
источник
+1, я всегда боюсь давить Enter:)
Жоао Портела
Не знал ничего из этого. Отмена убийца. Хорошо для редактирования любой командной строки.
Филипп А.
9

Я всегда был неравнодушен к:

ctrl-E # move cursor to end of line
ctrl-A # move cursor to beginning of line

Я также использую shopt -s cdable_vars, тогда вы можете создавать переменные bash для общих каталогов. Итак, для дерева исходных текстов моей компании я создаю несколько переменных, таких как:

export Dcentmain="/var/localdata/p4ws/centaur/main/apps/core"

тогда я могу перейти в этот каталог cd Dcentmain.

Дрю Фрезелл
источник
Home и End делают то же самое, что и crtl-A и ctrl-E.
davidfg4
Это помогает на ноутбуках Mac, которые не имеют начальных и конечных клавиш.
Jamesh
К сожалению, ctrl-A также является клавишей escape screenпо умолчанию. Я переназначаю его в ctrl-X .screenrc, но тогда я не пользователь emacs.
система PAUSE
Несколько связанный с опцией cdable_vars, есть также переменная окружения CDPATH. Но это работает по-другому, потому что вы устанавливаете родительский каталог, как в PATH. С cdable_vars вы получаете больше контроля.
Zecc
1
Еще для вашего списка ярлыков: CTRL + K, чтобы удалить все от курсора до конца строки, CTRL + U, чтобы удалить все до курсора, ALT + F / ALT + B, чтобы переместить одно слово вперед / назад (или CTRL + стрелка влево / CTRL + стрелка вправо). +1 для cdable_vars!
Филипп А.
8

pbcopy

Это копирует в системный буфер обмена Mac. Вы можете передать ему команды ... try:

pwd | pbcopy

Макс Масник
источник
NB! Это специфичная для Mac команда.
Дала
Это не: alias pbcopy='xsel --clipboard --input' и alias pbpaste='xsel --clipboard --output'
wawawawa
7
$ touch {1,2}.txt
$ ls [12].txt
1.txt  2.txt
$ rm !:1
rm [12].txt
$ history | tail -10
...
10007  touch {1,2}.txt
...
$ !10007
touch {1,2}.txt
$ for f in *.txt; do mv $f ${f/txt/doc}; done
Аллан Уинд
источник
Используйте history 10вместо history | tail -10(что должно быть tail -n 10кстати, поскольку этот синтаксис устарел).
Приостановлено до дальнейшего уведомления.
7

Использование 'set -o vi' из командной строки или, что лучше, в .bashrc переводит вас в режим редактирования vi в командной строке. Вы начинаете в режиме «вставки», так что вы можете печатать и возвращать, как обычно, но если вы допустили «большую» ошибку, вы можете нажать клавишу esc, а затем использовать «b» и «f» для перемещения, как в vi. CW, чтобы изменить слово. Особенно полезно после того, как вы вызвали команду истории, которую хотите изменить.

Леонард
источник
7

Как и многие другие, моим любимым является нажатие клавиши [alt]. (Клавиши Alt и «.» Вместе) это то же самое, что $! (Вставляет последний аргумент из предыдущей команды), за исключением того, что он является немедленным и для меня легче набрать. (Просто не может быть использовано в сценариях)

например:

mkdir -p /tmp/test/blah/oops/something
cd [alt].
user11535
источник
Также попробуйте объединить его с Alt- [0-9] (нажмите первую комбинацию, затем отпустите, затем вторую). например, если последняя команда была 'mv foo bar', то "Alt-0 Alt-." дает «mv», «Alt-1 Alt-». дает «фу», «Alt-2 Alt-». и основной альт. оба дают «бар» и т. д.
Сэм Стоукс
1
Также попробуйте нажать Alt-. более одного раза (или нажмите клавишу «Alt», удерживайте ее, много раз нажмите точку, а затем отпустите клавишу «Alt»). Это аналогично нажатию Ctrl-R более одного раза.
Yoo
7

Объедините несколько команд, используя команду && :

./run.sh && tail -f log.txt

или

kill -9 1111 && ./start.sh
TChen
источник
1
в случае неудачи другая команда не будет выполнена (быстро, как в программировании)
Фредерик Морин
1
Противоположность заключается в использовании логического или «||» в котором правая сторона будет выполнена, только если левая сторона ложна. Пример: <code> command_1 || command_2 </ code>
Дала