使用Bash,你最喜欢的命令行技巧是什么?

使用Bash,你最喜欢的命令行技巧是什么?

What is your single most favorite command-line trick using Bash?

我们都知道如何使用-R来反转搜索历史记录,但是如果设置stty stop"",您是否知道可以使用-S转发搜索? 另外,您是否尝试过运行bind -p来查看列出的所有键盘快捷键? 默认情况下,Mac OS X上有超过455个。

什么是你最喜欢的晦涩难懂的技巧,键盘快捷键或使用bash的shopt配置?


快速重命名/移动带有后缀的文件:
cp /home/foo/realllylongname.cpp{,-old}

这扩展到:
cp /home/foo/realllylongname.cpp /home/foo/realllylongname.cpp-old


1
cd -

它是后退按钮的命令行等效项(将您带到您以前的目录)。


另一个喜欢:

1
!!

重复你的最后一个命令。最有用的形式:

1
sudo !!

我最喜欢的是'^ string ^ string2',它接受最后一个命令,用string2替换字符串并执行它

1
2
3
4
$ ehco foo bar baz
bash: ehco: command not found
$ ^ehco^echo
foo bar baz

Bash命令行历史记录指南


改名

例:

1
2
3
4
5
6
7
8
9
10
11
12
$ 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的粉丝,从最近提交的命令行返回:最后一项,第一个非命令项和所有非命令项。 (注意,shell首先打印出命令):

1
2
3
4
5
$ 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参数",如下所示:

1
2
3
4
$ echo foo bar baz
$ echo !:2
echo bar
bar

最后,使用路径名,您可以通过将:h:t附加到上述任何扩展中来获取路径的某些部分:

1
2
3
4
5
$ ls /usr/bin/id
/usr/bin/id
$ echo Head: !$:h  Tail: !$:t
echo Head: /usr/bin Tail: id
Head: /usr/bin Tail: id

运行命令时,有时我会想要使用前面的参数运行命令。为此,您可以使用此快捷方式:

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

偶尔,如果我需要在文件列表上运行一堆命令,我将打破一行循环,而不是使用find。

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

在我的.bash_login(或.bashrc)中配置命令行历史记录选项非常有用。以下是我在Macbook Pro上使用的一系列设置。

设置以下内容使bash擦除历史记录中的重复命令:

1
export HISTCONTROL="erasedups:ignoreboth"

我也把我的历史规模提高了很多。为什么不?它似乎并没有减缓今天微处理器的速度。

1
2
export HISTFILESIZE=500000
export HISTSIZE=100000

我做的另一件事是忽略我历史上的一些命令。无需记住退出命令。

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

你肯定想设置他的。否则,bash会在您退出时覆盖您的历史记录。

1
shopt -s histappend

我使用的另一个选项是cmdhist。这使您可以将多行命令作为一个命令保存到历史记录中。

1
shopt -s cmdhist

最后,在Mac OS X上(如果你没有使用vi模式),你需要将 -S重置为滚动停止。这可以防止bash将其解释为正向搜索。

1
stty stop""

如何仅列出当前子目录中的子目录?

1
ls -d */

这是一个简单的技巧,但你不知道我需要多少时间来找到那个!


ESC.

插入上一个bash命令中的最后一个参数。它比你想象的更方便。

1
cp file /to/some/long/path

cd ESC.


当然,您可以"diff file1.txt file2.txt",但Bash支持进程替换,这允许您diff输出命令。

例如,假设我想确保我的脚本给出了我期望的输出。我可以将我的脚本包装在<()中并将其提供给diff以获得快速和脏的单元测试:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
$ cat myscript.sh
#!/bin/sh
echo -e"one
three"

$
$ ./myscript.sh
one
three
$
$ cat expected_output.txt
one
two
three
$
$ diff <(./myscript.sh) expected_output.txt
1a2
> two
$

再举一个例子,假设我想检查两台服务器是否安装了相同的RPM列表。而不是sshing到每个服务器,将每个RPM列表写入单独的文件,并对这些文件执行diff,我可以从我的工作站执行diff

1
2
3
4
5
6
7
8
9
10
11
$ 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上的高级Bash-Scripting Guide。


我最喜欢的命令是"ls -thor"

它召唤众神的力量,以便于阅读的格式列出最近修改过的文件。


更多新奇,但它很聪明......

使用的十大命令:

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

样本输出:

1
2
3
4
5
6
7
8
9
10
 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等设置别名,但有时你想逃避别名。只需在前面的命令中添加反斜杠:

例如:

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

很酷,不是吗?


这是一些配置调整:

~/.inputrc

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

这与^R相同,但使用箭头键。这意味着我可以键入(例如)cd /media/然后按向上箭头以转到cd'd在/media/文件夹中的最后一个内容。

(我使用Gnome Terminal,您可能需要更改其他终端模拟器的转义码。)

Bash完成也非常有用,但它是一个更加微妙的补充。在~/.bashrc中:

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

这将启用每个程序选项卡完成(例如,当命令行以evince开头时尝试选项卡完成将仅显示evince可以打开的文件,并且它还将选项卡完成命令行选项)。

~/.inputrc中也可以很好地使用它:

1
2
3
set completion-ignore-case on
set show-all-if-ambiguous on
set show-all-if-unmodified on

我经常使用以下内容:

用于打印历史记录结果的:p修饰符。例如。

1
!!:p

将打印最后一个命令,以便在再次运行之前检查它是否正确。只需输入!!即可执行。

与此相类似:

1
!?foo?:p

将在您的历史记录中搜索包含字符串'foo'的最新命令并打印它。

如果您不需要打印,

1
!?foo

搜索并立即执行。


我有一个秘密武器:shell-fu。

有大量的智能提示,很酷的技巧和高效的食谱,大多数时间都适合一条线。

我喜欢的一个(但是我因为我现在在大多数Unix系统上安装了Python这一事实而作弊):

1
alias webshare='python -m SimpleHTTPServer'

现在每次输入"webshare"时,当前目录都可以通过端口8000获得。当你想在没有usb密钥或远程目录的本地网络上与朋友共享文件时,真的很好。流媒体视频和音乐也会起作用。

当然,经典的叉炸弹完全没用但仍然很有趣:

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

不要在生产服务器中尝试...


您可以将watch命令与另一个命令结合使用以查找更改。这方面的一个例子就是当我测试我的路由器时,我希望获得有关信噪比等信息的最新数据。

1
watch --interval=10 lynx -dump http://dslrouter/stats.html

我喜欢使用echo构造命令并将它们传递给shell:

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

为什么?因为它允许我在我做之前看看将要做什么。这样,如果我有一个可怕的错误(比如删除我的主目录),我可以在它发生之前捕获它。显然,这对于破坏性或不可撤销的行为最为重要。


1
type -a PROG

为了找到PROG可用的所有地方,通常在?/ bin中的某个地方
而不是/ usr / bin / PROG中可能预期的那个。


下载大文件时,我经常这样做:

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

然后,当我完成时(或者如果ls返回非零),只需按ctrl + c。它类似于watch程序,但它使用shell,因此它适用于没有watch的平台。

另一个有用的工具是netcat或nc。如果你这样做:

1
nc -l -p 9100 > printjob.prn

然后,您可以在另一台计算机上设置打印机,而是使用运行netcat的计算机的IP地址。发送打印作业时,运行netcat的计算机会将其接收并转储到printjob.prn中。


在点击可怕的输入之前展开复杂的线条

  • Alt + Ctrl + e shell-expand-line(可能需要在键盘上使用EscCtrl + 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

&C。


pushdpopd几乎总是派上用场


当我在树层次结构中广泛分离的位置使用多个目录时,导航的一种首选方法是使用acf_func.sh(下面列出)。一旦定义,你就可以做到

cd -

使用数字菜单查看最近目录的列表

cd -2

转到第二个最近的目录。

非常好用,非常方便。

这是代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
# 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


我一直偏爱:

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

我也使用shopt -s cdable_vars,然后你可以创建bash变量到公共目录。所以,对于我公司的源代码树,我创建了一堆变量,如:

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

然后我可以通过cd Dcentmain更改到该目录。


pbcopy

这将复制到Mac系统剪贴板。你可以管道命令...尝试:

pwd | pbcopy


1
2
3
4
5
6
7
8
9
10
11
12
$ 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改变一个词。在您启动了要更改的历史命令之后特别有用。


重复的文件查找器

这将从当前目录递归地运行校验和,并返回所有相同校验和结果的文件名:

1
find ./ -type f -print0 | xargs -0 -n1 md5sum | sort -k 1,32 | uniq -w 32 -d --all-repeated=separate | sed -e 's/^[0-9a-f]*\ *//;'

当然,你可以改变路径。
可能将其放入函数或别名中,并将目标路径作为参数传递。


使用&&命令将多个命令串在一起:

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

要么

1
kill -9 1111 && ./start.sh

与上面的许多类似,我目前最喜欢的是击键[alt]。 (Alt和"。"键在一起)这与$相同! (插入上一个命令的最后一个参数),除了它是立即的,并且我更容易键入。 (不能在脚本中使用)

例如:

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

! <命令的前几个字符>将执行匹配的最后一个命令。

例:

!b将运行"build whatever -O -p -t -i -on"
!.将运行./a.out

它适用于长而重复的命令,如编译,构建,执行等。它在编码和测试时节省了太多时间。


我有很多目录,我想快速访问,CDPATH变量是解决方案
这极大地加速了我的工作流程:

1
export CDPATH=.:/home/gadolin/sth:/home/gadolin/dir1/importantDir

现在使用cd我可以跳转到/home/gadolin/sth/home/gadolin/dir1/importantDir的任何子目录而不提供完整路径。 也像我在那里一样在这里工作!
所以如果有目录/home/gadolin/sth/1 /home/gadolin/sth/2,我在哪里输入cd 1,我就在那里。


Ctrl + L通常会清除屏幕。从Bash提示符(显然)和GDB中工作,以及许多其他提示。


使用历史记录子字符!#来访问当前命令行,并结合^$等。

例如。使用"old-"前缀移动文件:

mv file-with-long-name-typed-with-tab-completion.txt old-!#^


http://www.commandlinefu.com也是一个很棒的网站。

我在那里学到了非常有用的东西:

1
sudo !!

要么

1
mount | column -t

删除除重要文件以外的所有内容

1
2
# shopt -s extglob
# rm -rf !(important-file)

在zsh中相同:

1
# rm -rf *~important-file

Bevore我知道我必须将重要的f move移到另一个字典中,删除所有内容并将重要内容再次移回。


您应该能够将以下内容粘贴到bash终端窗口中。

显示ANSI调色板:

1
2
3
4
5
6
7
8
9
10
11
12
e="\033["
for f in 0 7 `seq 6`; do
  no="" bo=""
  for b in n 7 0 `seq 6`; do
    co="3$f"; p=" "
    [ $b = n ] || { co="$co;4$b";p=""; }
    no="${no}${e}${co}m   ${p}${co} ${e}0m"
    bo="${bo}${e}1;${co}m ${p}1;${co} ${e}0m"
  done
  echo -e"$no
$bo"

done

256色演示:

1
2
3
yes"$(seq 232 255;seq 254 -1 233)" |
while read i; do printf"\x1b[48;5;${i}m
"
; sleep .01; done

好吧,这可能有点偏离主题,但如果你是一个Emacs用户,我会说"emacs"是最强大的技巧......在你投票之前,在emacs实例中尝试"Mx shell"......你在emacs中获得了一个shell,并拥有emacs的所有功能以及shell的强大功能(有一些限制,比如在其中打开另一个emacs,但在大多数情况下它比vanilla bash提示更强大) )。


Curly-Brace扩展:

在运行带有很多选项的./configure时真的很方便:

1
2
3
./configure --{prefix=/usr,mandir=/usr/man,{,sh}libdir=/usr/lib64,\
enable-{gpl,pthreads,bzlib,lib{faad{,bin},mp3lame,schroedinger,speex,theora,vorbis,xvid,x264},\
pic,shared,postproc,avfilter{-lavf,}},disable-static}

这实际上是我对ffmpeg的配置设置。没有大括号,它是409个字符。

或者,甚至更好:

1
echo"I can count to a thousand!" ...{0,1,2,3,4,5,6,7,8,9}{0,1,2,3,4,5,6,7,8,9}{0,1,2,3,4,5,6,7,8,9}...

作为CTRL-r向后搜索的扩展,如果绑定"history-search-backward",则可以使用历史记录自动完成当前输入。我通常将它绑定到它在tcsh中的相同键:ESC-p。您可以通过在.inputrc文件中放入以下行来完成此操作:

"\M-p": history-search-backward

例如。如果你以前执行了'make some_really_painfully_long_target',你可以输入:

> make

它会给你

> make some_really_painfully_long_target


当你意识到你输入错误的行时,一件简单的事就是按Ctrl + C;如果你想保留该行,但需要先执行其他操作,请使用反斜杠开始一个新行 - ,然后按Ctrl + C.该行将保留在您的历史记录中。


我在提示中喜欢一抹颜色:

1
export PS1="\[\033[07;31m\] \h \[\033[47;30m\] \W \[\033[00;31m\] \$ \[\e[m\]"

我恐怕我没有截图看起来像什么,但它应该是(像所有在一条线上):

1
2
3
[RED BACK WHITE TEXT] Computer name
[BLACK BACK WHITE TEXT] Working Directory
[WHITE BACK RED TEXT] $

根据您的喜好自定义:)


插入前一行的最终参数

ALT-.有史以来最有用的组合,试试看,因为某些原因,没有人知道这个。

再次按此按钮可选择较旧的最后参数。

很棒的时候你想对你刚刚用过的东西做些什么。


SSH隧道:

1
ssh -fNR 1234:localhost:22 root@123.123.123.123

不是我最喜欢的,如果您使用复制和粘贴尝试任何其他答案非常有帮助:

1
2
3
4
function $
{
   "$@"
}

现在,您可以在每行的开头粘贴包含$提示的示例。


我在别名中有各种印刷错误更正

1
2
3
alias mkae=make

alias mroe=less

"最后一个命令的最后一个参数"对我来说最简单的击键是!$

1
2
3
4
5
6
7
echo what the heck?

what the heck?

echo !$

heck?

使用别名可以节省时间

1
alias myDir ="cd /this/is/a/long/directory; pwd"

alias ..='cd ..'

因此,当导航回目录时,只需使用..


消除文件中的重复行

1
#sort -u filename > filename.new

列出与条件不匹配的所有行

1
#grep -v ajsk filename

这些不一定是Bash特定的(但是他们都不是ls -thor :))

其他一些有用的cmds:

prtdiag,psrinfo,prtconf - 更多信息在这里和这里(我博客上的帖子)。


我是Bash作业控制的忠实粉丝,主要是使用Control-Zfg,特别是如果我在终端进行开发的话。如果我打开emacs并需要编译,部署等,我只需Control-Z暂停emacs,做我需要的,然后fg将其恢复。这使得所有emacs缓冲区保持完整,并且比重新启动我正在做的任何事情都容易得多。


CTRL + D退出shell。


$_(美元下划线):上一个命令的最后一个字。与!$类似,但它不会像!$那样在您的历史记录中替换它。


不是很模糊,但我绝对喜欢的功能之一是标签完成。
当你通过整个子树结构导航时,或当你使用一些模糊或长命令时,真的很有用!


几年前,我发现了p *命令或获取有关进程的信息:ptree,pgrep,pkill和pfiles。当然,它们的母亲都是ps,但你需要将输出管道输入less,grep和/或awk来理解重负载下的输出。顶部(和变体)也有帮助。


而这个对我来说至关重要:

设置-o vi

/艾伦


|排序| uniq -c |排序-n

将给你一个所有不同事件的计数。

通常,awk,sed或cut帮助解析数据。


在两个单独的目录之间导航并来回复制文件时,我这样做:

1
2
3
4
5
6
7
8
cd /some/where/long
src=`pwd`
cd /other/where/long
dest=`pwd`

cp $src/foo $dest

command completion will work by expanding the variable, so you can use tab completion to specify a file you're working with.

这可以防止更少(少于更多)清除文件末尾的屏幕:

1
export LESS="-X"

du -a | sort -n |尾巴-99

找到要清理的大文件(或文件目录)以释放磁盘空间。


Shell-fu是一个存储,调节和传播命令行提示和技巧的地方。有点像StackOverflow,但仅适用于shell。你会在那里找到很多关于这个问题的答案。


其他人在Emacs中推荐"M-x shell RET"。我认为"M-x eshell RET"更好。


GNU / Linux的pbcopy和pbpaste别名

1
2
alias pbcopy='xclip -selection clipboard'
alias pbpaste='xclip -selection clipboard -o'


扩展的globbing:

1
rm !(foo|bar)

*那样展开,不带foobar

1
2
3
4
5
6
7
$ ls
foo
bar
foobar
FOO
$ echo !(foo|bar)
foobar FOO

对于纯粹的幽默因素,创建一个空文件"我自己",然后:$ touch myself


信号捕获:

您可以捕获发送到shell进程的信号,并让它们在各自的环境中静默运行命令,就像在命令行上键入一样:

1
2
3
4
5
6
# TERM or QUIT probably means the system is shutting down; make sure history is
# saved to $HISTFILE (does not do this by default)
trap 'logout'                      TERM QUIT

# save history when signalled by cron(1) script with USR1
trap 'history -a && history -n'    USR1

不是真正的交互式shell技巧,但有效但仍然是编写好脚本的技巧。

getopts,shift,$ OPTIND,$ OPTARG:

我喜欢制作可自定义的脚本:

1
2
3
4
5
6
7
8
9
10
11
while getopts 'vo:' flag; do
    case"$flag" in
        'v')
        VERBOSE=1
        ;;
        'o')
        OUT="$OPTARG"
        ;;
    esac
done
shift"$((OPTIND-1))"

xargs的(1):

我有一个三核处理器,喜欢运行在一组文件上执行压缩或其他CPU密集型串行操作的脚本。我喜欢使用xargs作为作业队列加快速度。

1
2
3
4
5
6
7
8
9
if ["$#" -gt 1 ]; then
    # schedule using xargs
    (for file; do
        echo -n"$file"
        echo -ne '\0'
    done) |xargs -0 -n 1 -P"$NUM_JOBS" --"$0"
else
    # do the actual processing
fi

这很像make -j [NUM_JOBS]


可编程完成:

没有什么花哨。当我使用Knoppix时,我总是禁用它,因为它经常会妨碍它。只是一些基本的:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
shopt -s progcomp

complete -A stopped -P '%'          bg
complete -A job     -P '%'          fg jobs disown wait
complete -A variable                readonly export
complete -A variable -A function    unset
complete -A setopt                  set
complete -A shopt                   shopt
complete -A helptopic               help
complete -A alias                   alias unalias
complete -A binding                 bind
complete -A command                 type which \
                                    killall pidof
complete -A builtin                 builtin
complete -A disabled                enable

快速文字

我经常使用这些文本序列,因此我通过.inputrc为它们添加了快捷方式:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# redirection short cuts
"\ew":           "2>&1"
"\eq":           "&>/dev/null &"
"\e\C-q":        "2>/dev/null"
"\eg":           "&>~/.garbage.out &"
"\e\C-g":        "2>~/.garbage.out"

$if term=xterm
"\M-w":          "2>&1"
"\M-q":          "&>/dev/null &"
"\M-\C-q":       "2>/dev/null"
"\M-g":          "&>~/.garbage.out &"
"\M-\C-g":       "2>~/.garbage.out"
$endif

ctrl-u删除所有写入的东西


bash可以重定向到TCP / IP套接字和从TCP / IP套接字重定向。
/ dev / tcp /和/ dev / udp。

有些人认为这是一个安全问题,
但这就是像Solaris X的监狱那样的操作系统级安全性。

正如Will Robertson所说,改变提示做事......打印命令#for!nn
设置Xterm终端名称。如果它是一个旧的Xterm,它不会嗅到流量来设置它的标题。


再次排名前十的命令(如ctcherry的帖子,只有更短):

1
history | awk '{ print $2 }' | sort | uniq -c |sort -rn | head

因为我总是需要for i in $(ls)语句,所以我做了一个快捷方式:

1
2
3
4
5
6
fea(){
   if test -z ${2:0:1}; then action=echo; else action=$2; fi
   for i in $(ls $1);
      do $action $i ;
   done;
}

另一个是:

1
echo ${!B*}

它将打印以'B'开头的所有已定义变量的列表。


想要获取日志文件的最后几行?

1
tail /var/log/syslog

想要密切关注日志文件何时发生变化?

1
tail -f /var/log/syslog

想从一开始快速读取文件吗?

1
more /var/log/syslog

想快速查找文件是否包含某些文本?

1
grep"find this text" /var/log/syslog

1
sudo !!

使用管理员权限运行最后一个命令。


在Mac OS X上,

1
ESC .

将循环通过最近的论点。那就是:按下并释放ESC,然后按下并释放.(周期键)。在Ubuntu上,我认为它是ALT+.

你可以不止一次地做到这一点,回顾你最近的所有论点。它有点像CTRL + R,但仅用于参数。它也比!!$!更安全,因为您可以在实际运行命令之前看到您将获得的内容。


在导航深树结构时,我有一个非常愚蠢,但非常有用的一个。把它放在.bashrc(或类似的)中:

1
2
3
4
5
alias cd6="cd ../../../../../.."
alias cd5="cd ../../../../.."
alias cd4="cd ../../../.."
alias cd3="cd ../../.."
alias cd2="cd ../.."

我最喜欢的bash之一就是"tar pipe"。当你有一个巨大数量的文件从一个目录复制到另一个目录时,如果文件数太高并且爆炸了bash globber,那么"cp * / an / other / dir"就不起作用了,所以,tar管道:

(cd /path/to/source/dir/ ; tar cf - * ) | (cd /path/to/destination/ ; tar xf - )

...如果你有netcat,你甚至可以通过网络做"netcat tar pipe"!


一些Bash掘金队也在这里:

http://codesnippets.joyent.com/tag/bash


1
2
3
while IFS= read -r line; do
echo"$line"
done < somefile.txt

这是逐行处理文件的好方法。需要清除IFS才能在行的前端或末尾获取空白字符。获取所有原始字符(包括反斜杠)需要"-r"。


我是新手编程的mac,我很想能够从bash启动gui程序......所以我必须创建这样的函数:

1
2
3
4
function macvim
{
/Applications/MacVim.app/Contents/MacOS/Vim"$@" -gp &
}

我一直很喜欢这个。
将其添加到/ etc / inputrc或?/ .inputrc中

" E [A":历史搜索落后
" E [B":历史搜索前进

当您键入ls 时,它将替换为以"ls"开头的最后一个命令或您放入的任何其他命令。


适合制作包含符号链接的目录的精确递归复制/备份(而不是像cp一样跟随它们或忽略它们):

1
2
3
$ mkdir new_dir
$ cd old_dir
$ tar cf - . | ( cd ../old_dir; tar xf - )


当您希望TAB完成忽略具有某些后缀的文件或文件夹时,FIGNORE环境变量很好,例如:

1
export FIGNORE="CVS:.svn:~"

如果要定义除空格之外的项分隔符,请使用IFS环境变量,例如:

1
2
export IFS="
"

这将使您能够循环遍历其中包含空格的文件和文件夹,而不执行任何魔术,如下所示:

1
2
3
4
5
6
7
8
9
10
$ touch"with spaces" withoutspaces
$ for i in `ls *`; do echo $i; done
with
spaces
withoutspaces
$ IFS="
"

$ for i in `ls *`; do echo $i; done
with spaces
withoutspaces

我在寻找一些音频和视频编辑工具时发现了一些有用的mencoder命令:

从.xxx到.avi

1
mencoder movie.wmv -o movie.avi -ovc lavc -oac lavc

转储视频中的声音:

1
mplayer -ao pcm -vo null -vc dummy -dumpaudio -dumpfile fileout.mp3 filein.avi

作为快速计算器,比如计算一个百分比:

1
2
3
4
5
6
7
8
9
$ date
Thu Sep 18 12:55:33 EDT 2008
$ answers=60
$ curl"http://stackoverflow.com/questions/68372/what-are-some-of-your-favorite-command-line-tricks-using-bash"  > tmp.html
$ words=`awk '/class="post-text"/ {s = s $0} \
> /<\/div>/ { gsub("<[^>]*>","", s); print s; s =""} \
> length(s) > 0 {s = s $0}'
tmp.html \
> |  awk '{n = n + NF} END {print n}'`
$ answers=`awk '/([0-9]+) Answers/ {sub("","", $1); print $1}' tmp.html`

最后:

1
2
3
$ echo $words words, $answers answers, $((words / $answers)) words per answer
4126 words, 60 answers, 68 words per answer
$

不是划分,而不是舍入。但通常这对于快速计算来说已经足够了。


1
2
3
4
5
6
7
# Batch extension renamer (usage: renamer txt mkd)
renamer() {
   local fn
   for fn in *."$1"; do
     mv"$fn""${fn%.*}"."$2"
   done
}

./mylittlealgorithm output.txt


仅适用于Mac。这很简单,但我希望我多年前知道这个。

1
open ./

在Finder中打开当前目录。您也可以使用它打开任何文件的默认应用程序。也可以用于URL,但前提是您在URL前加上http://,这限制了它打开偶尔随机站点的实用程序。


如何使用find |查找哪些文件与文本匹配grep -H
在这个例子中,哪个ruby文件包含跳转字符串 -

找 。 -name'* .rb'-exec grep -H jump {} ;


我想提一下如何使用批处理模式将top命令输出重定向到文件(-b)

$ top -b -n 1> top.out。$(日期+%s)

默认情况下,使用交互模式调用top,其中top无限期运行并接受keypress以重新定义top如何工作。

我写的帖子可以在这里找到


我喜欢设置一个提示,显示xterm的窗口标题中的当前目录。它还显示时间和当前目录。此外,如果bash想要报告后台作业已完成,则使用ANSI转义序列以不同的颜色报告。我使用黑光控制台,所以如果你偏爱黑光,我的颜色可能不适合你。

1
2
PROMPT_COMMAND='echo -e"\033]0;${USER}@${HOSTNAME%%.*}:${PWD/#$HOME/~}\007\033[1;31m${PWD/#$HOME/~}\033[1;34m"'
PS1='\[\e[1;31m\]\t \$ \[\e[0m\]'

确保您了解如何在PS1字符串中正确使用\[\],以便bash知道您的提示字符串实际呈现在屏幕上的时间。这样,当您超出单行命令时,它可以正确地重绘您的命令行。


我最喜欢的两个是:

1)使tab-completion case不敏感(例如"cd / home / User"将你的命令行转换为:"cd / home / user"如果后者存在而前者不存在。你可以通过"set completion"打开它-ignore-case on"在提示符处,或通过在您的.inputrc文件中添加"set completion-ignore-case"来永久添加它。

2)内置的'type'命令就像"which",但也知道别名。例如

1
2
3
4
$ type cdhome
cdhome is aliased to 'cd ~'
$ type bash
bash is /bin/bash

为了能够快速编辑你知道的shell脚本在$ PATH中(不要尝试使用ls ...):

1
function viscr { vi $(which $*); }

我总是将默认提示设置为"username @ hostname:/ current / path / name / in / full>"

1
2
PS1='\u@\h:\w> '
export PS1

当您处理许多不同的机器时,可以避免许多混乱。


我更喜欢在vi中读取手册页,所以我在.profile或.bashrc文件中有以下内容

1
2
3
4
man () {
    sought=$*
    /usr/bin/man $sought | col -b | vim -R -c"set nonumber" -c"set syntax=man"  -
}

当运行具有大量输出的命令(如大"make")时,我不仅要保存输出,还要看到它:

make install 2>&1 | tee E.make


自定义标签完成(compgen和完整的bash内置)

选项卡完成很不错,但能够将其应用于文件名以外的功能非常棒。我用它来创建自定义函数来扩展我一直使用的命令的参数。例如,假设您经常需要将FQDN作为参数添加到命令(例如ping blah.really.long.domain.name.foo.com)。你可以使用compgen和complete来创建一个bash函数来读取/ etc / hosts文件的结果,这样你只需输入:

1
ping blah.<tab>

它将显示您当前的所有匹配选项。

所以基本上可以返回单词列表的任何东西都可以用作函数。


Apropos历史 - 使用神秘的插入符号等并不完全直观。要打印包含给定字符串的所有历史记录项:

1
function histgrep { fc -l -$((HISTSIZE-1)) | egrep"$@" ;}

1
2
alias -- ddt='ls -trFld'
dt () { ddt --color"$@" | tail -n 30; }

为您提供当前目录中的最新文件。我用它所有的时间...


如果我在目录中搜索某些内容,但我不确定该文件,那么我只需通过以下方式grep目录中的文件:

1
find . -exec grep whatIWantToFind {} \;

您已更改为新目录,并希望将文件从新目录移动到旧目录。一举一动:mv file $OLDPWD


1
2
alias mycommand = 'verylongcommand -with -a -lot -of -parameters'
alias grep='grep --color'

用grep找到多个单词:

1
netstat -c |grep 'msn\|skype\|icq'

1
find -iregex '.*\.py$\|.*\.xml$' | xargs egrep -niH 'a.search.pattern'  | vi -R -

搜索所有Python文件和所有XML文件中的模式,并将结果通过只读Vim会话进行管道传输。


推荐阅读

    linux命令行大全如何?

    linux命令行大全如何?,地址,命令,基础,工作,管理,单位,数据,标准,目录,文件,l

    linux命令行打开浏览?

    linux命令行打开浏览?,系统,网络,网址,工具,密码,首页,服务,网站,数据,地址,l

    linux开启命令行命令?

    linux开启命令行命令?,系统,单位,工具,电脑,首页,终端,情况,密码,权威,命令,l

    linux命令行模式登录?

    linux命令行模式登录?,系统,密码,信息,状态,情况,终端,环境,管理,电脑,位置,l

    linux退出的命令行?

    linux退出的命令行?,档案,状态,平台,系统,命令,名字,信息,编辑,模式,文件,lin

    linux命令行播放声音?

    linux命令行播放声音?,系统,设备,手机,电脑,软件,量化,数据,管理,首页,服务,l

    linuxc关机命令行?

    linuxc关机命令行?,系统,状态,工作,命令,管理,用户,方式,终端,级别,参数,linu

    linux命令行创建组?

    linux命令行创建组?,系统,代码,密码,软件,用户组,用户,命令,选项,用户名,文

    linux命令行模式使用?

    linux命令行模式使用?,工作,地址,目录,信息,名称,系统,管理,命令,文件,标准,l

    linux命令行路径补全?

    linux命令行路径补全?,系统,名称,软件,情况,命令,工具,智能,信息,不了,终端,l

    终端命令行安装linux?

    终端命令行安装linux?,软件,系统,工具,终端,工作,状态,公司,官网,中心,时间,l

    linux命令行输入取消?

    linux命令行输入取消?,系统,档案,命令,情况,管理,状态,信息,环境,百度,目录,L

    linux中命令行的if?

    linux中命令行的if?,工作,系统,工具,地址,基础,命令,地方,网络,信息,标准,lin

    linux命令设置密码?

    linux命令设置密码?,密码,系统,服务,软件,地址,电脑,流程,管理,用户,命令,问

    linux命令行上下滑动?

    linux命令行上下滑动?,系统,工作,地址,信息,命令,目录,文件,不了,环境,预期,l

    linux更新安装命令行?

    linux更新安装命令行?,软件,系统,工作,在线,地址,名称,官网,命令,中心,情况,L

    高效的linux命令行?

    高效的linux命令行?,系统,工作,标准,信息,地址,命令,目录,电脑,设备,管理,lin

    linux命令行编辑教程?

    linux命令行编辑教程?,工具,工作,系统,命令,发行,环境,地方,终端,编辑,文件,l

    linux开启终端命令行?

    linux开启终端命令行?,密码,系统,电脑,终端,首页,工具,软件,命令,权限,用户,l

    linux命令行打开火狐?

    linux命令行打开火狐?,咨询,系统,火狐,软件,首页,浏览器,设备,官方网站,环