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*.cAlt + *
 rm -r source/delete_me.c source/do_not_delete_me.c
- 
Ctrl + Alt + e在当前行上执行别名,历史logging和shell扩展。 换句话说,当前行将被重新显示,因为它将被shell处理: ls $HOME/tmpCtrl 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。 
 您可以使用任何历史事件的gs和s命令,例如 
 !-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 + a和Ctrl + e分别将光标移动到当前行的开始和结束处。 
- 
Ctrl + t和Alt + t将当前光标前的字符和单词转置,然后向前移动光标。 
- 
Alt + u和Alt + l将当前单词(从光标到结尾)转换为大写和小写。 提示:按Alt + -后跟任一这些命令来转换当前单词的开始 。 
 奖金man提示: 
- 
在查看 man页时,使用/search页面内的文本。 使用n跳转到下一场比赛或前一场比赛的N.
- 
通过利用格式化来加速search man页中的特定命令或子部分: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上,取消注释并继续。
  大括号代替do和done 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在我的机器上。