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

时间:2020-03-05 18:54:54  来源:igfitidea点击:

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

使用bash,我们最喜欢的晦涩trick俩,键盘快捷键或者商店配置是什么?

解决方案

回答

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

回答

我们可以将watch命令与另一个命令结合使用以查找更改。例如,当我测试路由器时,我想获取有关信噪比等信息的最新数字。

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

回答

更多新颖的东西,但是它很聪明...

使用的前10个命令:

$ history | awk '{print }' | awk 'BEGIN {FS="|"}{print }' | 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

回答

cd -

它在命令行上等效于后退按钮(将我们带到我们所在的上一个目录)。

回答

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

有些人认为这是安全问题,
但这就是针对OS X的安全性,例如Solaris X的牢狱之灾。

正如威尔·罗伯逊(Will Robertson)所指出的,更改提示以执行操作...打印命令!
设置Xterm终端名称。如果它是旧的Xterm,并且不监听流量以设置其标题。

回答

我喜欢提示中的色彩:

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

恐怕我没有屏幕截图,但应该是这样(全部在一行上):

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

根据我们希望看到的内容进行自定义:

回答

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

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中。

回答

我在寻找一些音频和视频编辑工具时发现了一些有用的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

回答

ESC。

插入最后一个bash命令中的最后一个参数。它比我们想的要方便得多。

cp file /to/some/long/path

cd ESC。

回答

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

$ 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"

我们肯定要设置histappend。否则,bash会在我们退出时覆盖历史记录。

shopt -s histappend

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

shopt -s cmdhist

最后,在Mac OS X上(如果我们未使用vi模式),我们将要重置<CTRL> -S为滚动停止。这会阻止bash将其解释为正向搜索。

stty stop ""

回答

改名

例子:

$ 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

太有用了

回答

另一个最爱:

!!

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

sudo !!

回答

我喜欢用echo构建命令并将它们通过管道传递给shell:

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

为什么?因为它可以让我在开始之前先看一下要做什么。这样,如果我遇到了一个可怕的错误(例如删除主目录),则可以在错误发生之前将其捕获。显然,这对于破坏性或者不可撤销的行为最为重要。

回答

这是几个配置调整:

〜/ .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可以打开的文件,并且也将提供制表符补全命令行选项)。

也可以在〜/ .inputrc中很好地工作:

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

回答

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

" \ M-p":向后搜索历史记录

例如。如果我们以前执行过" make some_really_painfully_long_target",则可以输入:

>使&lt;ESC p>

它会给你

>使some_really_painfully_long_target

回答

我是!$!^!*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添加到上述任意expandos中来获得路径的一部分:

$ ls /usr/bin/id
/usr/bin/id
$ echo Head: !$:h  Tail: !$:t
echo Head: /usr/bin Tail: id
Head: /usr/bin Tail: id

回答

$ 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

回答

这实际上是我的关键:

设置-o vi

/艾伦

回答

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

回答

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

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

当我们输入ls &lt;up-arrow>时,它将被最后一个以" ls"或者其他任何命令开头的命令替换。

回答

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

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

回答

pushdpopd几乎总是派上用场

回答

在命令行中使用" set -o vi",或者在.bashrc中使用更好的设置,可以使我们进入命令行的vi编辑模式。我们从"插入"模式开始,因此可以像往常一样键入和退格,但是如果犯了"较大"错误,则可以按esc键,然后像在vi中一样使用" b"和" f"来移动。连续变词。调出要更改的历史记录命令后,此功能特别有用。

回答

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

export LESS="-X"

回答

我更喜欢在vi中阅读手册页,因此我的.profile或者.bashrc文件中包含以下内容

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

回答

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

alias mkae=make

alias mroe=less

回答

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

回答

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

echo what the heck?

what the heck?

echo !$

heck?

回答

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

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

或者

kill -9 1111 && ./start.sh

回答

在树形层次结构中彼此分开的多个位置中使用多个目录时,导航的一种首选方法是使用acf_func.sh(下面列出)。定义后,我们可以执行

光盘-

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

光盘-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 [[  ==  "--" ]]; then
    dirs -v
    return 0
  fi

  the_new_dir=
  [[ -z  ]] && 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

回答

在两个单独的目录之间导航并来回复制文件时,请执行以下操作:

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.

回答

我一直都偏爱:

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转到该目录。

回答

<任何>排序| uniq -c |排序-n

将为我们提供所有<anything>出现次数的计数。

通常,awk,sed或者cut帮助解析<anything>中的数据。

回答

du -a |排序-n |尾巴-99

查找大文件(或者文件目录)以进行清理以释放磁盘空间。

回答

我经常使用以下内容:

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

!!:p

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

与此相类似:

!?foo?:p

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

如果我们不需要打印,

!?foo

搜索并立即执行它。

回答

$ _(美元下划线):上一个命令的最后一个单词。与!$类似,不同的是它不会像!$那样将其替换到历史记录中。

回答

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

它召唤众神以一种方便阅读的格式列出最近修改的文件的能力。

回答

消除文件中的重复行

#sort -u filename > filename.new

列出所有不符合条件的行

#grep -v ajsk filename

这些不一定是特定于Bash的(但是嘿,ls -thor也不是)

其他一些有用的cmds:

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

回答

type -a PROG

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

回答

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

用grep查找多个单词:

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

回答

我最喜欢的是'^ string ^ string2',它接受最后一条命令,将string替换为string2并执行

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

Bash命令行历史记录指南

回答

并不是很模糊,但是我绝对喜欢的功能之一就是制表符补全。
当我们浏览整个子树结构时,或者使用一些晦涩或者冗长的命令时,这确实很有用!

回答

几年前,我发现了p *命令或者获得有关进程的信息:ptree,pgrep,pkill和pfiles。当然,它们全都是ps,但是我们需要将输出传递到less,grep和/或者awk中,以了解重负载下的输出。顶部(和变体)也有帮助。

回答

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

回答

如果我要在目录中搜索某些内容,但是不确定该文件,则可以通过以下方式对目录中的文件进行grep:

find . -exec grep whatIWantToFind {} \;

回答

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

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

回答

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

例如:

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

回答

当我们意识到自己刚刚键入了错误的行时,只需按一下Ctrl + C即可。如果要保留该行,但需要先执行其他操作,请以反斜杠\开始新行,然后按Ctrl + C。该行将保留在历史记录中。

回答

我经常为vi,ls等使用别名,但有时我们想转义别名。只需在前面的命令中添加反斜杠即可:

例如:

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

不错,不是吗?

回答

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

显示ANSI调色板:

e="3["
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

回答

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

tail /var/log/syslog

是否想留意日志文件的更改时间?

tail -f /var/log/syslog

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

more /var/log/syslog

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

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

回答

CTRL + D退出外壳。

回答

为了能够快速编辑我们知道在$ PATH中的shell脚本(请勿尝试使用ls ...):

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

回答

Apropos历史记录-使用隐式插入符号等并非完全直观。要打印包含给定字符串的所有历史记录项目,请执行以下操作:

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

回答

当我们希望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

回答

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

例子:

!b将运行"构建任何-O -p -t -i -on"
!.将运行。/ a.out

它与长且重复的命令(如编译,构建,执行等)一起使用时效果最佳。在编码和测试时,它为我节省了很多时间。

回答

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

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

回答

自定义选项卡完成(compgen和完整的bash内置函数)

Tab Completion很不错,但是能够将其不仅应用于文件名也很不错。我使用它来创建自定义函数,以将参数扩展为我一直使用的命令。例如,假设我们经常需要将FQDN作为命令的参数添加(例如ping blah.really.long.domain.name.foo.com)。我们可以使用compgen和complete创建一个bash函数,该函数读取/ etc / hosts文件以获取结果,因此我们只需输入以下内容即可:

ping blah.<tab>

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

因此,基本上所有可以返回单词列表的东西都可以用作函数。

回答

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

进行安装2>&1 |三通

回答

作为一个快速计算器,说出要计算一个百分比:

$ 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 
$ echo $words words, $answers answers, $((words / $answers)) words per answer
4126 words, 60 answers, 68 words per answer
$
} \ > /<\/div>/ { gsub("<[^>]*>", "", s); print s; s = ""} \ > length(s) > 0 {s = s
history | awk '{ print  }' | sort | uniq -c |sort -rn | head
}' tmp.html \ > | awk '{n = n + NF} END {print n}'` $ answers=`awk '/([0-9]+) Answers/ {sub("<h2>", "", ); print }' tmp.html`

最后:

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

不是该划分被截断,不是四舍五入。但这通常足以进行快速计算。

回答

排名前10的命令再次出现(如ctcherry的帖子,仅更短):

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

回答

我是Mac上编程的新手,我想念无法从bash启动gui程序...所以我必须创建如下函数:

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

回答

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

alias webshare='python -m SimpleHTTPServer'

当我们处理许多不同的机器时,避免了很多混乱。

回答

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

这是逐行处理文件的好方法。需要清除IFS才能在行的开头或者结尾获得空白字符。需要" -r"来获取所有原始字符,包括反斜杠。

回答

我有一个秘密武器:贝芙。

有成千上万的技巧,绝妙的技巧和有效的食谱,大多数时候都可以放在一行上。

我最喜欢的一个(但是我作弊了一点,因为我使用了现在大多数Unix系统上都安装了Python的事实):

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

现在,每次我们键入" webshare"时,当前目录都可以通过端口8000访问。当我们想与没有usb密钥或者远程目录的本地网络上的朋友共享文件时,这真是太好了。流视频和音乐也可以。

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

# rm -rf *~important-file

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

回答

一些Bash块也位于此处:

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

回答

我最喜欢的bash技巧之一是"焦油烟斗"。当我们有大量文件要从一个目录复制到另一个目录时,如果文件数太多并炸毁了bash globber,则执行" cp * / an / other / dir"不起作用:

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

...如果我们有netcat,甚至可以通过网络进行" netcat tar管道"!

回答

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

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

在zsh中也一样:

$ 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
$

以前,我知道我必须将重要的字段移至另一本词典,删除所有内容,然后再次将重要的字段移回原处。

回答

在浏览深树结构时,我有一个非常愚蠢但非常有帮助的人。将其放在.bashrc中(或者类似名称):

$ 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
$

回答

使用历史记录替换字符!#^$等结合使用以访问当前命令行。

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

带有长标签名的mv文件,带有tab-completion.txt旧版本!#^

回答

当然,我们可以" diff file1.txt file2.txt",但是Bash支持进程替换,它允许我们对命令的输出进行" diff"。

例如,假设我要确保我的脚本给了我期望的输出。我可以将脚本包装在<()中,并将其输入到diff中,以进行快速而肮脏的单元测试:

ESC .

再举一个例子,假设我要检查两个服务器是否安装了相同的RPM列表。我不必在每个服务器上挂接,将RPM的每个列表写成单独的文件并在这些文件上执行" diff"操作,而只需在工作站上执行" diff"操作即可:

ls -d */

还有更多的例子
高级Bash脚本指南,网址为http://tldp.org/LDP/abs/html/process-sub.html。

回答

在Mac OS X上,

sudo !!

将循环使用最新的论点。那就是:按下并释放ESC,然后按下并释放.(句号)。在Ubuntu上,我认为它是" ALT +"。

我们可以多次执行此操作,以回顾所有最近的论点。有点像CTRL + R,但仅用于参数。它也比!!或者$!安全得多,因为在实际运行命令之前,我们已经看到了要得到的东西。

回答

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

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

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

回答

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

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

回答

PROMPT_COMMAND='echo -e "3]0;${USER}@${HOSTNAME%%.*}:${PWD/#$HOME/~}
alias myDir = "cd /this/is/a/long/directory; pwd"
73[1;31m${PWD/#$HOME/~}3[1;34m"' PS1='\[\e[1;31m\]\t $ \[\e[0m\]'

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

回答

我最喜欢的两个是:

1)使制表符补全大小写不区分大小写(例如," cd / home / User"将命令行转换为:" cd / home / user",如果后者存在而前者不存在)。 -ignore-case on"提示,或者通过将" setcomplete-ignore-case on"添加到.inputrc文件中来永久添加。

2)内置的"类型"命令类似于"哪个",但也知道别名。例如

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

回答

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

echo ${!B*}

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

回答

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

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

默认情况下,top是使用交互式模式调用的,该模式下top无限期运行并接受按键以重新定义top的工作方式。

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

回答

使用别名可以节省时间

sudo !!

回答

Shell-fu是一个用于存储,审核和传播命令行技巧的地方。有点像StackOverflow,但仅用于shell。我们将在此处找到很多有关此问题的答案。

回答

我是Bash作业控制的忠实拥护者,主要使用Control-Zfg,尤其是当我在终端中进行开发时。如果我已经打开emacs并需要编译,部署等。我只要按Control-Z挂起emacs,做我需要做的,然后按fg将它恢复。这样可以使所有emacs缓冲区保持完整,并使事情比重新启动我正在做的事情容易得多。

回答

因为我一直需要$(ls)中的for for语句,所以我做了一个捷径:

mount | column -t

另一个是:

open ./

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

回答

http://www.commandlinefu.com还是一个不错的网站。

我在那里学到了很多有用的东西:

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

或者

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

回答

插入前几行最后一个参数

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

反复按它以选择较旧的最后一个参数。

当我们想对刚刚使用过的东西做其他事情时,这很棒。

回答

pbcopy

这将复制到Mac系统剪贴板。我们可以将命令通过管道传递给它...尝试:

pwd | pbcopy

回答

alias .. ='cd ..'

因此,在浏览目录时,只需使用.. &lt;Enter>

回答

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

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

回答

仅Mac。这很简单,但是我希望我早在几年前就已经知道了。

# 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

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

回答

卷曲支撑扩展:

当运行带有许多选项的。/ configure时,它确实派上用场:

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

从字面上看,这是我对ffmpeg的配置设置。如果不使用大括号,则为409个字符。

或者,甚至更好:

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

回答

ctrl -u删除所有书面内容

回答

快速文字

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

if [ "$#" -gt 1 ]; then
    # schedule using xargs
    (for file; do
        echo -n "$file"
        echo -ne '
# 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
' done) |xargs -0 -n 1 -P "$NUM_JOBS" -- "
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]*\ *//;'
" else # do the actual processing fi

回答

可编程完成:

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

ssh -fNR 1234:localhost:22 [email protected]

回答

并不是真正的交互式Shell技巧,但是仍然可以作为编写好的脚本的技巧。

getopts,shift,$ OPTIND,$ OPTARG:

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

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

xargs(1):

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

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

这很像make -j [NUM_JOBS]

回答

./mylittlealgorithm <input.txt> output.txt

回答

信号捕获:

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

rm !(foo|bar)

回答

重复文件查找器

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

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

当然,我们可以更改路径。
也许将其放入函数或者别名中,然后将目标路径作为参数传递。

回答

SSH隧道:

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

回答

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

回答

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

##代码##

现在,使用cd可以跳转到/ home / gadolin / sth或者/ home / gadolin / dir1 / importantDir的任何子目录,而无需提供完整路径。而且<tab>在这里也可以正常工作!
因此,如果有目录/ home / gadolin / sth / 1// home / gadolin / sth / 2`,则无论在哪里我都键入cd 1.

回答

##代码##

回答

扩展的globbing:

##代码##

*一样扩展,而没有foo或者bar

##代码##

回答

GNU / Linux的pbcopy和pbpaste别名

##代码##

回答

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