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

时间:2008-09-16 00:56:00

标签: bash command-line

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

使用bash,你最喜欢的一个最不起眼的技巧,键盘快捷键或shopt配置是什么?

105 个答案:

答案 0 :(得分:158)

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

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

答案 1 :(得分:150)

cd -

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

答案 2 :(得分:135)

另一个最爱:

!!

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

sudo !!

答案 3 :(得分:81)

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

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

Bash command line history guide

答案 4 :(得分: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

非常有用

答案 5 :(得分:61)

我是!$!^!* expandos的粉丝,从最近提交的命令行返回:最后一项,第一个非命令项,以及所有非命令项目。 (注意,shell首先打印出命令):

$ 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

答案 6 :(得分:47)

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

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

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

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

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

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

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模式),你需要重置&lt; CTRL&gt; -S进行滚动停止。这可以防止bash将其解释为正向搜索。

stty stop ""

答案 7 :(得分:43)

如何在当前的

中列出子目录?

ls -d */

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

答案 8 :(得分:41)

ESC

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

cp file /to/some/long/path

cd ESC

答案 9 :(得分:36)

当然,您可以“diff file1.txt file2.txt”,但Bash支持process substitution,它允许您diff输出命令。

例如,假设我想确保我的脚本能够提供我期望的输出。我可以将我的脚本包装在&lt;()中并将其提供给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列表。而不是sshing到每个服务器,将每个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上的高级Bash-Scripting Guide。

答案 10 :(得分:35)

我最喜欢的命令是“ls -thor”

它召唤power of the gods以便于阅读的格式列出最近修改过的文件。

答案 11 :(得分:28)

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

使用的十大命令:

$ 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

答案 12 :(得分:25)

^ R反向搜索。按^ R,键入要匹配的上一个命令的片段,然后按^ R直到找到所需的那个。然后我不必记住最近使用的命令仍然在我的历史记录中。不仅仅是bash,而且:^ E表示行尾,^ A表示行的开头,^ U和^ K分别表示在光标前后删除。

答案 13 :(得分:20)

我经常为vi,ls等设置别名,但有时你想要逃避别名。只需在前面的命令中添加反斜杠:

例如:

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

很酷,不是吗?

答案 14 :(得分: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开头时尝试选项卡完成将只显示evince可以打开的文件,并且它还将选项卡完成命令行选项。) / p>

~/.inputrc

中也可以很好地使用它
set completion-ignore-case on
set show-all-if-ambiguous on
set show-all-if-unmodified on

答案 15 :(得分:17)

我经常使用以下内容:

用于打印历史记录结果的:p修饰符。 E.g。

!!:p

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

以类似的方式:

!?foo?:p

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

如果您不需要打印,

!?foo

进行搜索并立即执行。

答案 16 :(得分:16)

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

有大量智能提示,很酷的技巧和高效的食谱,大部分时间都适合单行。

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

alias webshare='python -m SimpleHTTPServer'

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

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

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

请勿在生产服务器中尝试...

答案 17 :(得分:12)

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

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

答案 18 :(得分:11)

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

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

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

答案 19 :(得分:11)

type -a PROG

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

答案 20 :(得分:10)

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

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

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

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

nc -l -p 9100 > printjob.prn

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

答案 21 :(得分:10)

pushdpopd几乎总是派上用场

答案 22 :(得分:10)

当我在树层次结构中广泛分离的位置使用多个目录时,导航的一种首选方法是使用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

答案 23 :(得分: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

&安培; C。

答案 24 :(得分: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更改到该目录。

答案 25 :(得分:8)

pbcopy

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

pwd | pbcopy

答案 26 :(得分: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

答案 27 :(得分:7)

在命令行中使用'set -o vi',或者更好,在.bashrc中,使您在命令行中进入vi编辑模式。你可以在“插入”模式下开始,这样你就可以正常输入和退格,但是如果你犯了一个“大”的错误,你可以点击esc键,然后使用'b'和'f'像在vi中一样移动。 cw改变一个词。在你提出了你想要改变的历史命令之后特别有用。

答案 28 :(得分:7)

使用&amp;&amp; 命令将多个命令组合在一起:

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

kill -9 1111 && ./start.sh

答案 29 :(得分:7)

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

例如:

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

答案 30 :(得分:7)

重复文件查找器

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

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]*\ *//;'

当然,你可以改变周围的路径 也许将它放入函数或别名中,并将目标路径作为参数传递。

答案 31 :(得分:6)

!&lt;命令的前几个字符&gt;将执行匹配的最后一个命令。

示例:

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

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

答案 32 :(得分:5)

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

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

现在使用cd我可以跳转到/home/gadolin/sth/home/gadolin/dir1/importantDir的任何子目录,而无需提供完整路径。而且<tab>在这里工作就像我会在那里一样! 因此,如果有目录/home/gadolin/sth/1 /home/gadolin/sth/2,我会在任何地方输入cd 1,我就在那里。

答案 33 :(得分:4)

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

答案 34 :(得分:4)

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

显示ANSI调色板:

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\n$bo"
done

256色演示:

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

答案 35 :(得分:4)

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

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

zsh中的相同内容:

# rm -rf *~important-file

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

答案 36 :(得分:4)

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

E.g。使用“old-”前缀移动文件:

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

答案 37 :(得分:4)

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

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

sudo !!

mount | column -t

答案 38 :(得分:3)

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

答案 39 :(得分:3)

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

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

我担心我没有截图看起来像是什么,但它应该是类似的(所有在一条线上):

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

根据您的要求自定义:)

答案 40 :(得分:3)

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

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

E.g。如果您之前已执行'make some_really_painfully_long_target',则可以输入:

> make <ESC p>

它会给你

> make some_really_painfully_long_target

答案 41 :(得分:3)

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

答案 42 :(得分:3)

插入前一行最终参数

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

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

很棒,当你想对你刚刚用过的东西做些别的事情时。

答案 43 :(得分:3)

Curly-Brace扩展:

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

./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个字符。

或者,甚至更好:

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}...

答案 44 :(得分:2)

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

alias mkae=make

alias mroe=less

答案 45 :(得分:2)

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

echo what the heck?

what the heck?

echo !$

heck?

答案 46 :(得分:2)

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

答案 47 :(得分:2)

消除文件中的重复行

#sort -u filename > filename.new

列出与条件

不匹配的所有行
#grep -v ajsk filename

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

其他一些有用的cmds:

prtdiag,psrinfo,prtconf - 更多信息herehere(我博客上的帖子)。

答案 48 :(得分:2)

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

答案 49 :(得分:2)

CTRL + D 退出shell。

答案 50 :(得分:2)

使用别名可以节省时间

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

答案 51 :(得分:2)

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

答案 52 :(得分:2)

alias ..='cd ..'

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

答案 53 :(得分:2)

SSH隧道:

ssh -fNR 1234:localhost:22 root@123.123.123.123

答案 54 :(得分:2)

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

function $
{
    "$@"
}

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

答案 55 :(得分:1)

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

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

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

答案 56 :(得分:1)

这个对我来说至关重要:

set -o vi

/阿伦

答案 57 :(得分:1)

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

“\ E [A”:历史记录的搜索,向后 “\ E [B”:历史记录的搜索转发

当您键入ls <up-arrow>时,它将被替换为以“ls”开头的最后一个命令或您放入的任何其他命令。

答案 58 :(得分:1)

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

export LESS="-X"

答案 59 :(得分:1)

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

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.

答案 60 :(得分:1)

&LT;任何&GT; |排序| uniq -c | sort -n

将为您计算&lt; anything&gt;。

的所有不同事件

通常,awk,sed或cut帮助解析&lt; anything&gt;中的数据。

答案 61 :(得分:1)

du -a | sort -n |尾-99

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

答案 62 :(得分:1)

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

答案 63 :(得分:1)

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

tail /var/log/syslog

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

tail -f /var/log/syslog

想要从头开始快速阅读文件吗?

more /var/log/syslog

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

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

答案 64 :(得分:1)

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

export FIGNORE="CVS:.svn:~"

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

export IFS="
"

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

$ 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

答案 65 :(得分:1)

很适合对包含符号链接的目录进行精确的递归复制/备份(而不是像cp那样关注或忽略它们):

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

答案 66 :(得分:1)

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

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

答案 67 :(得分:1)

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

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

答案 68 :(得分:1)

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

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

答案 69 :(得分:1)

一些Bash掘金队也在这里:

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

答案 70 :(得分:1)

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

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

...如果你有netcat,你甚至可以do the "netcat tar pipe" through the network !!

答案 71 :(得分:1)

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

alias cd6="cd ../../../../../.."
alias cd5="cd ../../../../.."
alias cd4="cd ../../../.."
alias cd3="cd ../../.."
alias cd2="cd ../.."

答案 72 :(得分:1)

在Mac OS X上,

ESC .

将循环显示最近的参数。那就是:按下并释放ESC,然后按下并释放.(句号键)。在Ubuntu上,我认为它是ALT+.

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

答案 73 :(得分:1)

sudo !!

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

答案 74 :(得分:1)

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

答案 75 :(得分:1)

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

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

另一个是:

echo ${!B*}

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

答案 76 :(得分:1)

ctrl-u删除所有书面内容

答案 77 :(得分:1)

快速文字

我经常使用这些文本序列,因此我通过.inputrc将快捷方式放入其中:

# 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

答案 78 :(得分:1)

可编程完成:

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

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

答案 79 :(得分:1)

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

getopts,shift,$ OPTIND,$ OPTARG:

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

while getopts 'vo:' flag; do
    case "$flag" in
        'v')
        VERBOSE=1
        ;;
        'o')
        OUT="$OPTARG"
        ;;
    esac
done
shift "$((OPTIND-1))"

<强> xargs的(1):

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

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]非常相似。

答案 80 :(得分:1)

信号陷阱:

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

# 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

答案 81 :(得分:1)

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

答案 82 :(得分:1)

扩展通配:

rm !(foo|bar)

*foo之后展开bar

$ ls
foo
bar
foobar
FOO
$ echo !(foo|bar)
foobar FOO

答案 83 :(得分:1)

GNU / Linux的pbcopy和pbpaste别名

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

答案 84 :(得分:1)

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

答案 85 :(得分:0)

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

从.xxx到.avi

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

转储视频中的声音:

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

答案 86 :(得分:0)

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

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

答案 87 :(得分:0)

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

使用grep找到多个单词:

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

答案 88 :(得分:0)

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

答案 89 :(得分:0)

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

find . -exec grep whatIWantToFind {} \;

答案 90 :(得分:0)

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

为您提供当前目录中的最新文件。我一直都在使用它......

答案 91 :(得分:0)

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

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

答案 92 :(得分:0)

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

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

答案 93 :(得分:0)

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

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

ping blah.<tab>

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

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

答案 94 :(得分:0)

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

make install 2&gt;&amp; 1 | tee E.make

答案 95 :(得分:0)

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

$ 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("<h2>", "", $1); print $1}' tmp.html`

最后:

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

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

答案 96 :(得分:0)

我总是将默认提示设置为“username @ hostname:/ current / path / name / in / full&gt;”

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

当你处理许多不同的机器时,会造成很多混乱。

答案 97 :(得分:0)

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

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

答案 98 :(得分:0)

我最喜欢的两个是:

1)使标签完成大小写不敏感(例如“cd / home / User”将命令行转换为:“cd / home / user”如果后者存在而前者不存在。你可以打开它在提示符下“设置完成 - 忽略大小写”,或者通过在.inputrc文件中添加“set completion-ignore-case on”来永久添加它。

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

$ type cdhome
cdhome is aliased to 'cd ~'
$ type bash
bash is /bin/bash

答案 99 :(得分:0)

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

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知道您的提示字符串实际呈现在屏幕上的时间。这样就可以在超出单行命令时正确地重绘命令行。

答案 100 :(得分:0)

我想提一下如何使用批处理模式(-b)

将top命令输出重定向到文件

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

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

我写的帖子可以找到here

答案 101 :(得分:0)

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

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

答案 102 :(得分:0)

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

open ./

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

答案 103 :(得分:0)

./ mylittlealgorithm&lt; input.txt&gt; output.txt的

答案 104 :(得分:0)

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