Shell脚本通常用作粘合剂,用于自动化和简单的一次性任务.您最喜欢的Bash shell /脚本语言的"隐藏"功能有哪些?
每个答案一个功能
举一个示例和该功能的简短描述,而不仅仅是文档的链接
使用粗体标题作为第一行标记要素
也可以看看:
C的隐藏功能
C#的隐藏功能
C++的隐藏功能
Delphi的隐藏功能
Python的隐藏功能
Java的隐藏功能
JavaScript的隐藏功能
Ruby的隐藏功能
PHP的隐藏功能
Perl的隐藏功能
VB.Net的隐藏功能
chillitom.. 69
插入前一行的最终参数
alt- . 有史以来最有用的组合键,试试看,由于某种原因,没有人知道这个.
再次按此按钮选择较旧的最后一个参数.
很棒的时候你想对你刚刚用过的东西做些什么.
插入前一行的最终参数
alt- . 有史以来最有用的组合键,试试看,由于某种原因,没有人知道这个.
再次按此按钮选择较旧的最后一个参数.
很棒的时候你想对你刚刚用过的东西做些什么.
如果要在注销后继续运行进程:
disown -h
是一个有用的bash内置.与之不同nohup
,您可以disown
在已经运行的进程上运行.
首先,使用control-Z停止工作,从ps
(或使用echo $!
)获取pid ,使用bg
将其发送到后台,然后使用disown
-h标志.
不要忘记背景你的工作,否则当你注销时它会被杀死.
几乎所有手册中的EXPANSION部分都列出了所有内容
特别是参数扩展:
$ 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通过命令历史记录开始"反向增量搜索".当您继续键入时,它会检索包含您输入的所有文本的最新命令.
Tab 完成你到目前为止输入的单词,如果它是明确的.
Tab Tab 列出到目前为止您输入的单词的所有完成.
Alt+ * 插入所有可能的完成,这是特别有用的,例如,如果您刚刚输入带有通配符的潜在破坏性命令:
rm -r source/d*.c
Alt + *
rm -r source/delete_me.c source/do_not_delete_me.c
Ctrl+ Alt+ e在当前行上执行别名,历史记录和shell扩展.换句话说,当前行被重新显示,因为它将由shell处理:
ls $HOME/tmp
Ctrl Alt + e
ls -N --color=tty -T 0 /home/cramey
获取历史命令和参数
可以使用!
运算符有选择地访问先前的命令和参数.当您使用长路径时,它非常有用.
您可以查看上一个命令history
.
您可以使用以前的命令!
作为命令n
的索引history
,负数从历史记录中的最后一个命令向后计数.
ls -l foo bar touch foo bar !-2
您可以使用以前的参数!:
,零是命令,> = 1是参数.
ls -l foo touch !:2 cp !:1 bar
你可以将两者结合起来 !
touch foo bar ls -l !:1 !:2 rm !-2:1 !-2:2 !-2
您还可以使用参数范围 !
touch boo far ls -l !:1-2
其他!
特殊修饰符是:
*
对于所有的论点
ls -l foo bar ls !*
^
为第一个参数(!:1
== !^
)
$
为了最后一个论点
ls -l foo bar cat !$ > /dev/null
我喜欢-x功能,允许查看脚本中发生了什么.
bash -x script.sh
SECONDS=0; sleep 5 ; echo "that took approximately $SECONDS seconds"
SECONDS
每次引用此参数时,都会返回自返回shell调用以来的秒数.如果为SECONDS分配了值,则后续引用时返回的值是分配后的秒数加上分配的值.如果未设置SECONDS,即使它随后被重置,它也会丢失其特殊属性.
这是我的最爱之一.这将选项卡完成设置为不区分大小写.这对于快速键入目录路径非常有用,尤其是在默认情况下文件系统不区分大小写的Mac上.我把它放在.inputrc
我的主文件夹中.
set completion-ignore-case on
特殊变量随机:
if [[ $(($RANDOM % 6)) = 0 ]] then echo "BANG" else echo "Try again" fi
正则表达式处理
最近的bash版本具有正则表达式匹配功能,因此您可以:
if [[ "mystring" =~ REGEX ]] ; then echo match fi
其中REGEX是man re_format描述的格式的原始正则表达式.
来自任何括号部分的匹配存储在BASH_REMATCH数组中,从元素1开始(元素0是完整匹配的字符串),因此您也可以使用它来执行正则表达式的解析.
拼写错误的快速和肮脏纠正(对于使用命令历史记录并滚动浏览它的慢速连接的长命令尤其有用):
$ cat /proc/cupinfo cat: /proc/cupinfo: No such file or directory $ ^cup^cpu
还可以尝试!:s/old/new
使用上一个命令中的new替换旧的一次.
如果要替换多次出现,可以使用!:gs/old/new
.
您可以将gs
and s
命令与任何历史事件一起使用,例如
!-2:s/old/new
在倒数第二个命令old
中用new
(一次)替换.
Ctrlx Ctrle
这会将当前命令加载到变量VISUAL中定义的编辑器中.这对于像这里列出的一些长命令非常有用.
要使用vi作为编辑器:
export VISUAL=vi
这是我最喜欢的两个:
要检查没有真正执行脚本的语法,请使用:
bash -n script.sh
回到最后一个目录(是的,我知道pushd和popd,但这更快)
cd -
使用中缀布尔运算符
考虑简单的if:
if [ 2 -lt 3 ] then echo "Numbers are still good!" fi
那看起来有点难看.不是很现代.如果在布尔表达式周围使用双括号,则可以使用普通的布尔运算符!
if [[ 2 < 3 ]] then echo "Numbers are still good!" fi
阵列:
#!/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
有关数组(以及其他高级bash脚本编写内容)的更多详细信息,请参阅Advanced Bash-Scripting Guide.
在显示bash提示符之前运行命令
在"PROMPT_COMMAND"env变量中设置一个命令,它将在每个提示之前自动运行.例:
[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
页面时,用于/搜索页面中的文本.使用n提前跳转到下一场比赛或N前一个比赛.
man
通过利用其格式来加速搜索页面中的特定命令或子部分:
o /history expansion尝试/^history使用插入符号(^
)仅查找以"历史记录" 开头的行,而不是键入以查找该节.
o尝试/ read使用一些前导空格来搜索内置命令.Builtins总是在man
页面中缩进.
export TMOUT=$((15*60))
空闲时间15分钟后终止bash,设置为0表示禁用.我通常把它放在我的root帐户上的〜/ .bashrc中.管理您的盒子时很方便,您可能会在离开终端之前忘记注销.
C-S-- 控制Shift减去撤消键入操作.
任何删除操作C-w(删除前一个单词),C-k(删除到行尾),C-u(删除到行尾)等...将其删除的文本复制到kill ring,你可以粘贴最后一个kill:C-y并循环通过(和粘贴来自已删除项目的环Alt-y
通过设置FIGNORE
变量,可以在制表符完成时忽略某些文件.
例如,如果您有一个subverion repo,并且您想要更轻松地导航
export FIGNORE=".svn"
现在你可以cd
不被.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} a b c d e f g h i j k l m n o p q r s t u v w x y z $ 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