Shell脚本通常用作胶水,用于自动化和简单的一次性任务。Bash shell /脚本语言最喜欢的“隐藏”功能有哪些?
- 每个答案一项功能
- 提供功能的示例和简短描述,而不仅仅是文档的链接
- 使用粗体标题作为第一行标记功能
也可以看看:
Shell脚本通常用作胶水,用于自动化和简单的一次性任务。Bash shell /脚本语言最喜欢的“隐藏”功能有哪些?
也可以看看:
Answers:
插入前一行的最终参数
alt-. 有史以来最有用的组合键,请尝试一下,由于某种原因,没人知道这一组合。
反复按它以选择较旧的最后一个参数。
当您想对刚才使用过的东西做其他事情时,这很棒。
!$
很难快速输入。我总是不得不放慢脚步,考虑将美元符号放在第二位。Alt
+.
更快,更容易。更不用说,您实际上在执行文本之前就已看到了该文本。
如果要在注销后保持进程运行:
disown -h <pid>
是内置的有用的bash。与不同nohup
,您可以disown
在已经运行的进程上运行。
首先,使用control-Z停止工作,从ps
(或使用echo $!
)获取pid ,使用bg
将其发送到后台,然后disown
与-h标志一起使用。
不要忘记为您的工作提供背景知识,否则您的工作将在注销时被杀死。
jobs -l
(或-p
)
fork()
,exec()
它的参数是守护程序。我可以轰炸炮弹,一口气跑一些东西bgexec google-chrome && exit
。
screen
吗?
手册中“扩展”部分下列出的几乎所有内容
特别是参数扩展:
$ 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
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扩展。换句话说,当前行将重新显示,因为它将由外壳程序处理:
ls $HOME/tmp
Ctrl Alt + e
ls -N --color=tty -T 0 /home/cramey
取回历史命令和参数
可以使用!
运算符有选择地访问先前的命令和参数。当您使用长路径时,这非常有用。
您可以使用来检查最后的命令history
。
您可以将以前的命令用作命令!<n>
中n
的索引history
,负数从历史记录中的最后一条命令开始倒数。
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
这是我的最爱之一。这会将制表符补全设置为不区分大小写。这对于快速键入目录路径非常有用,尤其是在Mac上(默认情况下文件系统不区分大小写)。我把它放在.inputrc
我的主文件夹中。
set completion-ignore-case on
特殊变量随机:
if [[ $(($RANDOM % 6)) = 0 ]]
then echo "BANG"
else
echo "Try again"
fi
$
在算术评估内贴标;无需单独的评估和测试:if (( RANDOM % 6 == 0 )); then echo "BANG"; else echo "Try again"; fi
甚至更短:(( RANDOM % 6 )) && echo "Try again" || echo "BANG"
。
快速和肮脏的拼写错误纠正(对于通过慢速连接的长命令特别有用,因为使用命令历史记录并滚动查看它会很可怕):
$ cat /proc/cupinfo
cat: /proc/cupinfo: No such file or directory
$ ^cup^cpu
也试试 !:s/old/new
一次用上一个命令中的old替换new。
如果您想替换许多事件,可以使用 !:gs/old/new
。
您可以将gs
ands
命令用于任何历史事件,例如
!-2:s/old/new
在倒数第二个命令old
中用new
(一次)替换。
man bash
。尝试!:s/old/new
一次用上一个命令中的old替换new。如果您想替换许多事件,可以使用进行全局替换!:gs/old/new
。这可能与詹姆士的帖子( stackoverflow.com/questions/211378/hidden-features-of-bash/…),例如:(用上!$:s/old/new
一个命令的最后一个参数中的old替换new),!-2:0:gs/a/s !-2*
(用倒数第二个命令名称中带有s的a,并添加倒数第二个命令的所有参数)。祝好运!
使用中置布尔运算符
考虑以下简单情况:
if [ 2 -lt 3 ]
then echo "Numbers are still good!"
fi
-lt看起来有点丑。不是很现代。如果在布尔表达式周围使用双括号,则可以使用普通的布尔运算符!
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
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用一些前导空格搜索该内置命令。内置文件总是缩进man
页面中。
使用算术:
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
我最近读了《Csh编程被认为有害》,其中包含以下惊人的瑰宝:
考虑管道:
A | B | C
您想知道C的状态,这很容易:它在$?或csh中的$ status中。但是,如果您希望从A获得它,那么您就不走运了-如果您在csh中,那就是。在Bourne shell中,您可以获取它,尽管这样做有些棘手。在将dd的stderr放入grep -v管道中以消除记录输入/输出噪声的情况下,我必须做些事情,但是必须返回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;
并不是真正的功能,而是一个方向:我在commandlinefu.com上发现了许多“隐藏的功能”,秘密和各种bash有用性。这个答案有很多评分最高的答案,我是在该网站上学到的:)