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

StackOverflow https://stackoverflow.com/questions/68372

  •  09-06-2019
  •  | 
  •  

Вопрос

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

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

Это было полезно?

Решение 7

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

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

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

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

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

При установке следующего параметра bash удаляет дублирующиеся команды из вашей истории:

export HISTCONTROL="erasedups:ignoreboth"

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

export HISTFILESIZE=500000
export HISTSIZE=100000

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

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

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

shopt -s histappend

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

shopt -s cmdhist

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

stty stop ""

Другие советы

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

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

cd -

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

Еще один фаворит:

!!

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

sudo !!

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

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

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

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

Пример:

$ 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

Такой полезный

Я фанат того, что !$, !^ и !* 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й аргумент" вот так:

$ 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

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

ls -d */

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

ESC.

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

cp file /to/some/long/path

компакт-диск ESC.

Конечно, ты можешь "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
$

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

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

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

Скорее новинка, но это умно...

Топ-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

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

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

Например:

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

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

Вот пара настроек конфигурации:

~/.inputrc:

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

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

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

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

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

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

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

set completion-ignore-case on
set show-all-if-ambiguous on
set show-all-if-unmodified on

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

Тот Самый :p модификатор для печати результата истории.Например.

!!:p

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

В том же духе:

!?foo?:p

Выполнит поиск в вашей истории самой последней команды, которая содержала строку 'foo', и распечатает ее.

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

!?foo

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

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

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

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

alias webshare='python -m SimpleHTTPServer'

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

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

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

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

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

watch --interval=10 lynx -dump http://dslrouter/stats.html
type -a PROG

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

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

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

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

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

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.

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

Одним из предпочтительных способов навигации, когда я использую несколько каталогов в совершенно разных местах древовидной иерархии, является использование 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

Разверните сложные строки, прежде чем нажать страшную клавишу enter

  • Альт+Ctrl+eоболочка-развернуть-строка (возможно, потребуется использовать Esc, Ctrl+e на вашей клавиатуре)
  • Ctrl+_отменить
  • Ctrl+x, *глобус-развернуть-слово

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

иc.

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

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.

pbcopy

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

pwd | pbcopy

$ 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

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

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

например:

mkdir -p /tmp/test/blah/oops/something
cd [alt].

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

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

или

kill -9 1111 && ./start.sh
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top