Bash的隐藏function

Shell脚本通常用作粘合剂,用于自动化和简单的一次性任务。 什么是你最喜欢的Bash shell /脚本语言的“隐藏”function?

  • 每个答案一个function
  • 给出一个示例和function的简短描述,而不仅仅是文档的链接
  • 作为第一行使用粗体标题标记function

也可以看看:

  • C的隐藏function
  • C#隐藏的function
  • C ++的隐藏function
  • delphi隐藏的function
  • Python的隐藏function
  • Java的隐藏function
  • JavaScript的隐藏function
  • Ruby的隐藏function
  • PHP的隐藏function
  • Perl的隐藏function
  • VB.Net的隐藏function

插入前一行的最终参数

alt 有史以来最有用的组合,试试看,出于某种原因,没有人知道这个。

一遍又一遍地按下select旧的最后一个参数。

很好,当你想做别的事情时,你刚才使用的东西。

如果您想在注销后继续运行进程,请执行以下操作:

disown -h <pid>

是一个有用的bash内置。 与nohup不同,您可以在已经运行的进程上运行disown

首先,用control-Z停止你的工作,从ps获得pid(或者使用echo $! ),用bg把它发送到背景,然后用-h标志使用disown

不要忘记背景你的工作,否则当你注销时会被杀死。

几乎所有在手册的“扩展”部分下列出

特别是参数扩展:

 $ I=foobar $ echo ${I/oo/aa} #replacement faabar $ echo ${I:1:2} #substring oo $ echo ${I%bar} #trailing substitution foo $ echo ${I#foo} #leading substitution bar 

我的最爱:

 sudo !! 

用sudo重新运行上一个命令。

更多魔术键组合:

  • Ctrl + r通过您的命令历史开始“反向增量search”。 继续input时,它将检索包含您input的所有文本的最新命令。

  • Tab完成了你input的单词,如果它是明确的。

  • 选项 选项 列出到目前为止input的单词的所有完成项。

  • Alt + * 插入所有可能的完成项,如果刚input了一个可能具有通配符的破坏性命令,那么这个function特别有用:

    rm -r source/d*.c Alt + *
    rm -r source/delete_me.c source/do_not_delete_me.c

  • Ctrl + Alt + e在当前行上执行别名,历史logging和shell扩展。 换句话说,当前行将被重新显示,因为它将被shell处理:

    ls $HOME/tmp Ctrl Alt + e
    ls -N --color=tty -T 0 /home/cramey

取回历史命令和参数

有可能有select地访问以前的命令和参数使用! 运营商。 当你使用长path时,这是非常有用的。

你可以检查你的最后一个history命令。

您可以使用以前的命令,其中!<n>history命令的索引,负数从历史logging中的最后一个命令向后计数。

 ls -l foo bar touch foo bar !-2 

你可以使用前面的参数!:<n> ,零是命令,> = 1是参数。

 ls -l foo touch !:2 cp !:1 bar 

你可以把它们和!<n>:<m>结合起来

 touch foo bar ls -l !:1 !:2 rm !-2:1 !-2:2 !-2 

您也可以使用参数范围!<n>:<x>-<y>

 touch boo far ls -l !:1-2 

其他! 特殊的修饰符是:

  • *所有的论点

     ls -l foo bar ls !* 
  • ^为第一个参数( !:1 == !^

  • $为最后一个参数

     ls -l foo bar cat !$ > /dev/null 

我喜欢-xfunction,可以查看脚本中发生了什么。

 bash -x script.sh 

SECONDS=0; sleep 5 ; echo "that took approximately $SECONDS seconds"

SECONDS

每次引用此参数时,都会返回从shell调用返回的秒数。 如果将值分配给SECONDS,则在后续引用时返回的值是从赋值加上赋值后的秒数。 如果SECONDS未设置,即使随后重置,也会丢失其特殊属性。

特殊variables随机:

 if [[ $(($RANDOM % 6)) = 0 ]] then echo "BANG" else echo "Try again" fi 

这是我的最爱之一。 这将选项卡完成设置为不区分大小写。 快速input目录path非常好,特别是在默认情况下文件系统不区分大小写的Mac上。 我把它放在我的家庭文件夹.inputrc

 set completion-ignore-case on 

正则expression式处理

最近的bash版本具有正则expression式匹配function,所以你可以这样做:

 if [[ "mystring" =~ REGEX ]] ; then echo match fi 

其中REGEX是man re_format描述的格式的原始正则expression式。

从任何括号中的部分匹配存储在BASH_REMATCH数组中,从元素1开始(元素0是整个匹配的string),所以你可以使用它来做正则expression式分析。

Ctrl x Ctrl e

这会将当前命令加载到variablesVISUAL中定义的编辑器中。 这对于像这里列出的一些长命令是非常有用的。

要使用vi作为你的编辑器:

 export VISUAL=vi 

快速和错误的拼写错误更正(特别是对于慢速连接的长命令,使用命令历史logging和滚动浏览器会非常有用):

 $ cat /proc/cupinfo cat: /proc/cupinfo: No such file or directory $ ^cup^cpu 

也可以试试!:s/old/new在前一个命令中用new代替旧的。

如果你想replace很多事件,你可以用!:gs/old/new做一个全局replace。

您可以使用任何历史事件的gss命令,例如

 !-2:s/old/new 

在倒数第二个命令中用new (一次)代替old

这里我的两个最爱:

要检查没有真正执行脚本的语法,请使用:

 bash -n script.sh 

回到最后一个目录(是的,我知道pushd和popd,但这是更快)

 cd - 

使用中缀布尔运算符

考虑简单如果:

 if [ 2 -lt 3 ] then echo "Numbers are still good!" fi 

那 – 看起来有点难看。 不是很现代。 如果你在你的布尔expression式中使用双括号,你可以使用普通的布尔运算符!

 if [[ 2 < 3 ]] then echo "Numbers are still good!" fi 

arrays:

 #!/bin/bash array[0]="a string" array[1]="a string with spaces and \"quotation\" marks in it" array[2]="a string with spaces, \"quotation marks\" and (parenthesis) in it" echo "There are ${#array[*]} elements in the array." for n in "${array[@]}"; do echo "element = >>${n}<<" done 

有关arrays(以及其他高级bash脚本)的更多详细信息,请参阅高级Bash脚本指南 。

在显示bash提示符之前运行命令

在“PROMPT_COMMAND”envvariables中设置一个命令,它会在每个提示符之前自动运行。 例:

 [lsc@home]$ export PROMPT_COMMAND="date" Fri Jun 5 15:19:18 BST 2009 [lsc@home]$ ls file_a file_b file_c Fri Jun 5 15:19:19 BST 2009 [lsc@home]$ ls 

对于接下来的四月愚人,将“export PROMPT_COMMAND = cd”添加到某人的.bashrc,然后坐下来观看混乱。

魔术man页中的魔术键组合:

  • Ctrl + aCtrl + e分别将光标移动到当前行的开始和结束处。

  • Ctrl + tAlt + t将当前光标前的字符和单词转置,然后向前移动光标。

  • Alt + uAlt + l将当前单词(从光标到结尾)转换为大写和小写。

    提示:Alt + -后跟任一这些命令来转换当前单词的开始

奖金man提示:

  • 在查看man页时,使用/search页面内的文本。 使用n跳转到下一场比赛或前一场比赛的N.

  • 通过利用格式化来加速searchman页中的特定命令或子部分:

    o而不是打字/历史扩展find该部分,尝试/ ^历史 ,使用脱字符( ^ )仅查找以“历史” 开头的行。

    o尝试/阅读 ,用一些领先的空格来search内置的命令。 内build函数始终在man页中缩进。

export TMOUT=$((15*60))

15分钟空闲时间后终止bash,设置为0禁用。 我通常把这个放在〜/ .bashrc的根目录下。 当pipe理你的盒子时,它是方便的,你可能会忘记注销,然后离开terminal。

解开

CS - 控制Shift Minus撤消 – input操作。

杀/扬

任何删除操作Cw (删除前一个单词), Ck (删除到行尾), Cu (删除到行首)等…将其删除文本复制到杀戒,你可以粘贴最后一个杀: Cy和使用Alt-y循环(并粘贴)已删除项目的环

通过设置FIGNOREvariables,您可以在选项卡完成时忽略某些文件。

例如,如果你有一个subverion回购,并且你想要更容易地浏览

 export FIGNORE=".svn" 

现在你可以不用被.svn目录阻塞了。

使用算术:

 if [[ $((2+1)) = $((1+2)) ]] then echo "still ok" fi 

支撑扩展

标准扩展{x,y,z}:

 $ echo foo{bar,baz,blam} foobar foobaz fooblam $ cp program.py{,.bak} # very useful with cp and mv 

使用{x..y}进行序列扩展

 $ echo {a..z} abcdefghijklmnopqrstu vwxyz $ echo {a..f}{0..3} a0 a1 a2 a3 b0 b1 b2 b3 c0 c1 c2 c3 d0 d1 d2 d3 e0 e1 e2 e3 f0 f1 f2 f3 

我最近读了Csh编程认为有害的包含这个惊人的gem:

考虑pipe道:

 A | B | C 

你想知道C的状态,好吧,这很简单:它是$?,或者是csh中的$ status。 但如果你想从A那里得到它,那么你运气不好 – 如果你在csh中,那就是。 在Bourne shell中,你可以得到它,虽然这样做有点棘手。 这是我必须做的事情,我把dd的stderr放到grep -vpipe道中,以摆脱logging进出的噪音,但是必须返回dd的退出状态,而不是grep的:

 device=/dev/rmt8 dd_noise='^[0-9]+\+[0-9]+ records (in|out)$' exec 3>&1 status=`((dd if=$device ibs=64k 2>&1 1>&3 3>&- 4>&-; echo $? >&4) | egrep -v "$dd_noise" 1>&2 3>&- 4>&-) 4>&1` exit $status; 

截断文件的内容(清零文件)

 > file 

具体来说,这是非常好的截断日志文件,当文件被另一个进程打开,仍然可以写入文件。

不是一个真正的function,而是一个方向:我在commandlinefu.com上发现了许多“隐藏的function”,秘密和各种bash的用处。 许多最高评价答案,我在这个网站上了解到他们:)

另一个小的: Alt +

注释掉当前行并将其移入历史缓冲区。

所以,当你组装一个命令行,你需要发出一个临时命令来find一个文件时,你只需要点击alt +#,发出另一个命令,在历史logging上,取消注释并继续。

大括号代替dodone for循环

For循环体通常在do...done (只是一个例子):

 for f in *; do ls "$f"; done 

但是我们可以使用大括号使用C风格:

 for f in *; { ls "$f"; } 

我认为这看起来比做do...done ,我更喜欢这个。 我还没有在任何Bash文档中find这个,所以这真是一个隐藏的function。

C风格的数字expression式:

 let x="RANDOM%2**8" echo -n "$x = 0b" for ((i=8; i>=0; i--)); do let n="2**i" if (( (x&n) == n )); then echo -n "1" else echo -n "0" fi done echo "" 

这些属性是我的最爱之一。

 export HISTCONTROL=erasedups export HISTSIZE=1000 

第一个确保bash不会多次logging命令,真正提高了history的实用性。 另一个从100的默认扩展历史大小为1000.我实际上设置为10000在我的机器上。