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

156
задан 11 revs, 6 users 62% 5 October 2011 в 03:09
поделиться

87 ответов

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

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

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

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

Конфигурирование опций истории командной строки в моем .bash_login (или .bashrc) действительно полезно. Следующее является кадрами настроек, которые я использую на своем MacBook Pro.

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

export HISTCONTROL="erasedups:ignoreboth"

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

export HISTFILESIZE=500000
export HISTSIZE=100000

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

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

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

shopt -s histappend

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

shopt -s cmdhist

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

stty stop ""
47
ответ дан 4 revs, 2 users 98% 23 November 2019 в 21:47
поделиться

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

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

157
ответ дан user10765 23 November 2019 в 21:47
поделиться
$ 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
7
ответ дан Allan Wind 23 November 2019 в 21:47
поделиться

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

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

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

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

тогда я могу измениться на тот каталог на cd Dcentmain.

9
ответ дан Drew Frezell 23 November 2019 в 21:47
поделиться

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

CD -

для наблюдения списка недавних каталогов с числовым 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
ответ дан Leonard 23 November 2019 в 21:47
поделиться

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

10
ответ дан jdt141 23 November 2019 в 21:47
поделиться

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

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.

10
ответ дан 2 revs 23 November 2019 в 21:47
поделиться

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

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

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

11
ответ дан 2 revs 23 November 2019 в 21:47
поделиться
type -a PROG

для нахождения всех мест, где ПРОГР доступна, обычно где-нибудь в ~ / мусорное ведро, а не то в/usr/bin/PROG, который, возможно, ожидался.

11
ответ дан dajobe 23 November 2019 в 21:47
поделиться

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

watch --interval=10 lynx -dump http://dslrouter/stats.html
12
ответ дан HFLW 23 November 2019 в 21:47
поделиться

У меня есть секретное оружие: оболочка-fu.

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

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

alias webshare='python -m SimpleHTTPServer'

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

И конечно классическая fork-бомба, которая абсолютно бесполезна, но все еще большая забава:

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

не пробуют это в рабочем сервере...

16
ответ дан 2 revs, 2 users 97% 23 November 2019 в 21:47
поделиться

Я использую следующий много:

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

!!:p

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

В том же духе:

!?foo?:p

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

, Если Вы не должны печатать,

!?foo

, делает поиск и немедленно выполняет его.

17
ответ дан 2 revs 23 November 2019 в 21:47
поделиться

Вот несколько тонких настроек конфигурации:

~/.inputrc:

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

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

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

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

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

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

Работы приятно с этим также в [1 110]:

set completion-ignore-case on
set show-all-if-ambiguous on
set show-all-if-unmodified on
17
ответ дан 2 revs 23 November 2019 в 21:47
поделиться

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

25
ответ дан user10741 23 November 2019 в 21:47
поделиться

Больше новинки, но это умно...

Лучшие 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
28
ответ дан 3 revs, 3 users 82% 23 November 2019 в 21:47
поделиться

Моя любимая команда "ls - Тор",

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

35
ответ дан user10109 23 November 2019 в 21:47
поделиться

Несомненно, Вы можете" 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
$

Как другой пример, скажем, я хочу проверить, имеют ли два сервера тот же список установленного RPMs. Вместо sshing к каждому серверу, написав каждый список RPMs для разделения файлов, и делая 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 .

36
ответ дан 2 revs 23 November 2019 в 21:47
поделиться

ESC .

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

cp file /to/some/long/path

CD ESC .

41
ответ дан 3 revs, 3 users 63% 23 November 2019 в 21:47
поделиться

Как перечислить [только 111] подкаталоги в текущем?

ls -d */

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

43
ответ дан edomaur 23 November 2019 в 21:47
поделиться

Я - поклонник !$, !^ и !* 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 к любому вышеупомянутому expandos:

$ ls /usr/bin/id
/usr/bin/id
$ echo Head: !$:h  Tail: !$:t
echo Head: /usr/bin Tail: id
Head: /usr/bin Tail: id
60
ответ дан 3 revs 23 November 2019 в 21:47
поделиться

переименуйте

Пример:

$ 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

Так полезный

64
ответ дан Jiaaro 23 November 2019 в 21:47
поделиться

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

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

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

81
ответ дан 3 revs, 3 users 92% 23 November 2019 в 21:47
поделиться

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

, Например:

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

Прохладный, не так ли?

20
ответ дан Srikanth 23 November 2019 в 21:47
поделиться

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

7
ответ дан Leonard 23 November 2019 в 21:47
поделиться

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

, например:

mkdir -p /tmp/test/blah/oops/something
cd [alt].
7
ответ дан user11535 23 November 2019 в 21:47
поделиться

Другой фаворит:

!!

Повторения Ваша последняя команда. Самый полезный в форме:

sudo !!
135
ответ дан amrox 23 November 2019 в 21:47
поделиться

Представьте несколько команд в виде строки вместе с помощью & & команда:

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

или

kill -9 1111 && ./start.sh
7
ответ дан 2 revs, 2 users 80% 23 November 2019 в 21:47
поделиться
cd -

Это - командная строка, эквивалентная из кнопки "Назад" (берет Вас к предыдущему каталогу, Вы были в).

150
ответ дан Mark Biek 23 November 2019 в 21:47
поделиться

pbcopy

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

pwd | pbcopy

8
ответ дан 23 November 2019 в 21:47
поделиться

du-a | вид-n | хвост-99

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

1
ответ дан Kimbo 23 November 2019 в 21:47
поделиться
Другие вопросы по тегам:

Похожие вопросы: