Shell 点文件可以为你做点什么
不要问你可以为你的 shell 点文件 做什么,而是要问一个 shell 点文件可以为你做什么!
我一直在操作系统领域里面打转,但是在过去的几年中,我的日常使用的一直是 Mac。很长一段时间,我都在使用 Bash,但是当几个朋友开始把 zsh 当成宗教信仰时,我也试试了它。我没用太长时间就喜欢上了它,几年后,我越发喜欢它做的许多小事情。
我一直在使用 zsh(通过 Homebrew 提供,而不是由操作系统安装的)和 Oh My Zsh 增强功能。
本文中的示例是我的个人 .zshrc
。大多数都可以直接用在 Bash 中,我觉得不是每个人都依赖于 Oh My Zsh,但是如果不用的话你的工作量可能会有所不同。曾经有一段时间,我同时为 zsh 和 Bash 维护一个 shell 点文件,但是最终我还是放弃了我的 .bashrc
。
不偏执不行
如果你希望在各个操作系统上使用相同的点文件,则需要让你的点文件聪明点。
### Mac 专用
if [[ "$OSTYPE" == "darwin"* ]]; then
# Mac 专用内容在此
例如,我希望 Alt + 箭头键
将光标按单词移动而不是单个空格。为了在 iTerm2(我的首选终端)中实现这一目标,我将此代码段添加到了 .zshrc
的 Mac 专用部分:
### Mac 专用
if [[ "$OSTYPE" == "darwin"* ]]; then
### Mac 用于 iTerm2 的光标命令;映射 ctrl+arrows 或 alt+arrows 来快速移动
bindkey -e
bindkey '^[[1;9C' forward-word
bindkey '^[[1;9D' backward-word
bindkey 'ee[D' backward-word
bindkey 'ee[C' forward-word
fi
(LCTT 译注:标题 “We’re all mad here” 是电影《爱丽丝梦游仙境》中,微笑猫对爱丽丝讲的一句话:“我们这儿全都是疯的”。)
在家不工作
虽然我开始喜欢我的 Shell 点文件了,但我并不总是想要家用计算机上的东西与工作的计算机上的东西一样。解决此问题的一种方法是让补充的点文件在家中使用,而不是在工作中使用。以下是我的实现方式:
if [[ `egrep 'dnssuffix1|dnssuffix2' /etc/resolv.conf` ]]; then
if [ -e $HOME/.work ]
source $HOME/.work
else
echo "This looks like a work machine, but I can't find the ~/.work file"
fi
fi
在这种情况下,我根据我的工作 dns 后缀(或多个后缀,具体取决于你的情况)来提供(source
)一个可以使我的工作环境更好的单独文件。
(LCTT 译注:标题 “What about Bob?” 是 1991 年的美国电影《天才也疯狂》。)
你该这么做
现在可能是放弃使用波浪号(~
)表示编写脚本时的主目录的好时机。你会发现在某些上下文中无法识别它。养成使用环境变量 $HOME
的习惯,这将为你节省大量的故障排除时间和以后的工作。
如果你愿意,合乎逻辑的扩展是应该包括特定于操作系统的点文件。
(LCTT 译注:标题 “That thing you do” 是 1996 年由汤姆·汉克斯执导的喜剧片《挡不住的奇迹》。)
别指望记忆
我写了那么多 shell 脚本,我真的再也不想写脚本了。并不是说 shell 脚本不能满足我大部分时间的需求,而是我发现写 shell 脚本,可能只是拼凑了一个胶带式解决方案,而不是永久地解决问题。
同样,我讨厌记住事情,在我的整个职业生涯中,我经常不得不在一天之中就彻彻底底地改换环境。实际的结果是这些年来,我不得不一再重新学习很多东西。(“等等……这种语言使用哪种 for 循环结构?”)
因此,每隔一段时间我就会觉得自己厌倦了再次寻找做某事的方法。我改善生活的一种方法是添加别名。
对于任何一个使用操作系统的人来说,一个常见的情况是找出占用了所有磁盘的内容。不幸的是,我从来没有记住过这个咒语,所以我做了一个 shell 别名,创造性地叫做 bigdirs
:
alias bigdirs='du --max-depth=1 2> /dev/null | sort -n -r | head -n20'
虽然我可能不那么懒惰,并实际记住了它,但是,那不太 Unix ……
(LCTT 译注:标题 “Memory, all alone in the moonlight” 是一手英文老歌。)
输错的人们
使用 shell 别名改善我的生活的另一种方法是使我免于输入错误。我不知道为什么,但是我已经养成了这种讨厌的习惯,在序列 ea
之后输入 w
,所以如果我想清除终端,我经常会输入 cleawr
。不幸的是,这对我的 shell 没有任何意义。直到我添加了这个小东西:
alias cleawr='clear'
在 Windows 中有一个等效但更好的命令 cls
,但我发现自己会在 Shell 也输入它。看到你的 shell 表示抗议真令人沮丧,因此我添加:
alias cls='clear'
是的,我知道 ctrl + l
,但是我从不使用它。
(LCTT 译注:标题 “Typos, and the people who love them” 可能来自某部电影。)
要自娱自乐
工作压力很大。有时你需要找点乐子。如果你的 shell 不知道它显然应该执行的命令,则可能你想直接让它耸耸肩!你可以使用以下功能执行此操作:
shrug() { echo "¯_(ツ)_/¯"; }
如果还不行,也许你需要掀桌不干了:
fliptable() { echo "(╯°□°)╯ ┻━┻"; } # 掀桌,用法示例: fsck -y /dev/sdb1 || fliptable
想想看,当我想掀桌子时而我不记得我给它起了个什么名字,我会有多沮丧和失望,所以我添加了更多的 shell 别名:
alias flipdesk='fliptable'
alias deskflip='fliptable'
alias tableflip='fliptable'
而有时你需要庆祝一下:
disco() {
echo "(•_•)"
echo "<) )╯"
echo " / "
echo ""
echo "(•_•)"
echo " ( (>"
echo " / "
echo ""
echo " (•_•)"
echo "<) )>"
echo " / "
}
通常,我会将这些命令的输出通过管道传递到 pbcopy
,并将其粘贴到我正在使用的相关聊天工具中。
我从一个我关注的一个叫 “Command Line Magic” @ climagic 的 Twitter 帐户得到了下面这个有趣的函数。自从我现在住在佛罗里达州以来,我很高兴看到我这一生中唯一的一次下雪:
snow() {
clear;while :;do echo $LINES $COLUMNS $(($RANDOM%$COLUMNS));sleep 0.1;done|gawk '{a[$3]=0;for(x in a) {o=a[x];a[x]=a[x]+1;printf "