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。
您可以使用任何历史事件的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循环(并粘贴)已删除项目的环
通过设置FIGNORE
variables,您可以在选项卡完成时忽略某些文件。
例如,如果你有一个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在我的机器上。