本文共 5691 字,大约阅读时间需要 18 分钟。
shell 点文件
不要问您可以为您的外壳点文件做什么,而是要问一个外壳点文件可以为您做什么!
我遍及整个操作系统,但是在过去的几年中,我的日常驱动程序一直是Mac。 很长一段时间,我使用了Bash,但是当几个朋友开始将 ,我给了它一个机会。 我花了很长时间才欣赏它,几年后,我强烈喜欢它做的许多小事情。
我一直在使用zsh(通过提供,而不是安装的系统)和 。
本文中的示例适用于我的个人.zshrc
。 大多数人都可以直接在Bash中工作,我不相信任何人都依赖Oh My Zsh,但是您的里程可能会有所不同。 有一段时间,我同时为zsh和Bash维护了一个shell dotfile,但最终我还是放弃了.bashrc
。
如果您希望在操作系统之间使用相同的点文件,则需要给点文件一个小技巧。
### Mac Specifics if [[ "$OSTYPE" == "darwin"* ]]; then # Mac-specific stuff here. fi
例如,我期望Alt +箭头键将光标移动到单词而不是单个空格处。 为了在 (我的首选外壳程序)中实现这一目标,我将此代码段添加到了的Mac专用部分:
### Mac Specifics if [[ "$OSTYPE" == "darwin"* ]]; then ### Mac cursor commands for iTerm2; map ctrl+arrows or alt+arrows to fast-move bindkey -e bindkey '^[[1;9C' forward-word bindkey '^[[1;9D' backward-word bindkey '\e\e[D' backward-word bindkey '\e\e[C' forward-word fi
当我开始喜欢我的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后缀(或多个后缀,具体取决于您的情况)定为关键,并另存一个单独的文件,这使我的工作生活更加美好。
现在可能是放弃在编写脚本时使用波浪号( ~
)表示您的主目录的好时机。 您会发现在某些上下文中无法识别它。 养成使用环境变量$HOME
的习惯,将为您节省大量的故障排除时间和以后的工作。
如果您愿意,逻辑扩展将包括特定于操作系统的点文件。
同样,我讨厌记住事情,在我的整个职业生涯中,我不得不在一天的过程中进行彻底的上下文转换。 实际的结果是这些年来,我不得不多次重新学习很多东西。 (“等等……此语言使用哪种for循环结构?”)
因此,每隔一段时间我就会觉得自己厌倦了再次寻找做某事的方法。 我改善生活的一种方法是添加别名。
对于使用系统的任何人来说,一个常见的情况是找出占用了所有磁盘的内容。 不幸的是,我从来没有想起这种咒语,因此我创建了一个shell别名,创造性地称为bigdirs
:
alias bigdirs='du --max-depth=1 2> /dev/null | sort -n -r | head -n20'
虽然我可能不那么懒惰并真正记住它,但是,那不是Unix方式...
使用shell别名改善我的生活的另一种方法是使我免于错别字。 我不知道为什么,但是我已经养成了这种讨厌的习惯,在序列ea
后面键入w
,所以如果我想清除终端,我经常会键入cleawr
。 不幸的是,这对我的外壳没有任何意义。 直到我添加了这小块金:
alias cleawr='clear'
在Windows具有一个等效但更好的命令的实例中,我发现自己输入cls
。 看到您的外壳举起手来真令人沮丧,所以我添加:
alias cls='clear'
是的,我知道ctrl + l
,但从未使用过。
工作压力很大。 有时您只需要一点乐趣。 如果您的外壳不知道它应该明确执行的命令,也许您想直接将它耸肩! 您可以使用以下功能执行此操作:
shrug() { echo "¯\_(ツ)_/¯"; }
如果那不起作用,也许您需要翻转一张桌子:
fliptable() { echo "(╯°□°)╯ ┻━┻"; } # Flip a table. Example usage: 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:” 的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 "\033[%s;%sH ",o,x;printf "\033[%s;%sH*\033[0;0H",a[x],x;}}' }
我们已经看到了一些我使用的函数示例。 由于这些示例中几乎不需要参数,因此可以将它们作为别名来完成。 当它不仅仅是一个简短的声明时,我出于个人喜好使用函数。
在我职业生涯的不同时期,我都运行了 ,这是一个开源,可扩展的时间序列指标解决方案。 在足够多的情况下,我需要将度量标准路径(用句点表示)转置到文件系统路径(用斜杠表示),反之亦然,拥有专用于这些任务的功能变得很有用:
# Useful for converting between Graphite metrics and file paths function dottoslash() { echo $1 | sed 's/\./\//g' } function slashtodot() { echo $1 | sed 's/\//\./g' }
在我职业生涯的另一个时间里,我运行了很多Kubernetes。 如果您对运行Kubernetes不熟悉,则需要编写很多YAML。 不幸的是,编写无效的YAML并不难。 更糟糕的是,Kubernetes不会在尝试应用YAML之前对其进行验证,因此,除非您应用它,否则您不会发现它是无效的。 除非您先验证:
function yamllint() { for i in $(find . -name '*.yml' -o -name '*.yaml'); do echo $i; ruby -e "require 'yaml';YAML.load_file(\"$i\")"; done }
因为我厌倦了让自己感到尴尬并偶尔破坏客户的设置,所以我写了这个小片段并将其作为预提交的钩子添加到我所有相关的回购协议中。 在持续集成过程中,类似的内容将非常有帮助,尤其是在您作为团队成员的情况下。
我曾经是一位出色的触摸打字员。 那些日子已经一去不回。 我的打字错误超出了我的想象。
在不同的时间,我使用了大量的Chef或Kubernetes。 对我来说幸运的是,我从未同时使用过两者。
Chef生态系统的一部分是Test Kitchen,这是一组便于测试的工具,可通过kitchen test
命令调用。 Kubernetes使用CLI工具kubectl
管理。 这两个命令都需要几个子命令,并且都不能特别顺畅地滚动手指。
我没有创建一堆“ typo别名”,而是将这些命令别名为k
:
alias k='kitchen test $@'
要么
alias k='kubectl $@'
我职业生涯的最后一半涉及与其他人一起编写更多代码。 我曾在许多环境中工作过,在这些环境中,我们在帐户中分叉了回购协议的副本,并将拉取请求用作审核过程的一部分。 当我想确保给定回购的分支与父版本保持最新时,我使用fetchupstream
:
alias fetchupstream='git fetch upstream && git checkout master && git merge upstream/master && git push'
我喜欢颜色。 它可以使diffs之类的东西更易于使用。
alias diff='colordiff'
我以为彩色手册页是个巧妙的技巧,因此我合并了以下功能:
# Colorized man pages, from: # http://boredzo.org/blog/archives/2016-08-15/colorized-man-pages-understood-and-customized man() { env \ LESS_TERMCAP_md=$(printf "\e[1;36m") \ LESS_TERMCAP_me=$(printf "\e[0m") \ LESS_TERMCAP_se=$(printf "\e[0m") \ LESS_TERMCAP_so=$(printf "\e[1;44;33m") \ LESS_TERMCAP_ue=$(printf "\e[0m") \ LESS_TERMCAP_us=$(printf "\e[1;32m") \ man "$@" }
我爱的命令which
。 它只是告诉您正在运行的命令在文件系统中的位置,除非它是Shell函数。 在多个级联的点文件之后,有时不清楚函数的定义位置或作用。 事实证明, whence
和type
命令可以帮助您解决问题。
# Where is a function defined? whichfunc() { whence -v $1 type -a $1 }
希望本文对您有所帮助,并能激发您找到改善日常使用Shell的方法。 它们不必庞大,新颖或复杂。 他们可能会解决一些微小但频繁的摩擦,创建捷径,甚至提供减少常见错别字的解决方案。
欢迎您浏览我的 ,但我警告您,它可能需要大量清理。 请随意使用您认为有帮助的任何东西,并互相取长补短。
翻译自:
shell 点文件
转载地址:http://ogjzd.baihongyu.com/