在命令行中快速有效地工作

互联网上有很多命令行技巧和指标。 他们中的大多数都将琐碎的事情描述为“学习热键”或“ sudo !!将使用sudo运行先前的命令”。 取而代之的是,当您已经学会了热键并了解sudo !!时,我会告诉您该怎么做sudo !!


终端应立即启动


您花费多少时间启动终端机? 还有一个? 很长时间以来,我一直使用Ctrl + Alt + T快捷方式启动终端,我认为它很快。 从Openbox迁移到i3后,我开始通过Win + Enter启动终端,该绑定开箱即用。 你知道吗 现在,我认为Ctrl + Alt + T不够快。


当然,这不是毫秒级的提速,而是您在反射级别打开终端,完全没有意识到。


因此,如果您经常使用终端,但是抓住鼠标来启动它,请尝试配置方便的热键。 我敢肯定,您会喜欢的。


Zsh代替bash


我知道这是一个神圣的话题。 您应该为至少三个功能安装Zsh:高级自动完成,错字校正和多个路径名完成:当单个Tab将/u/s/d转换为/usr/share/doc 。 Arch Linux已经在其安装CD中迁移到Zsh。 我希望Zsh能够成为Ubuntu中的默认Shell。 那将是一个历史性的时刻。


开始使用Zsh一点也不困难。 只需通过包管理器安装它,然后找到一个漂亮的配置即可。 我建议采用Arch Linux中使用的配置:


 $ wget -O ~/.zshrc https://git.grml.org/f/grml-etc-core/etc/zsh/zshrc 

剩下的唯一一件事就是更改您的默认Shell并重新登录。


 $ chsh -s $(which zsh) 

仅此而已,就像什么都没有发生一样,继续工作。


shell提示应该是什么样子


Shell提示符是命令行开头在终端中显示的一小段文本。 应该为您的工作进行配置。 您可以将其视为车辆的仪表板。 请在此放置一些有用的信息,以帮助您导航! 方便使用,尤其是每天都看到的时候!


外壳提示应为彩色。 不同意吗? 尝试计算在此终端中执行了多少命令:



现在带有颜色:



Shell提示符应显示Shell的当前工作目录。 如果未显示当前工作目录,则必须牢记该目录,并使用pwd命令定期对其进行检查。 请不要那样做。 请记住一些非常重要的事情,不要浪费时间执行pwd命令。


如果有时切换到root帐户,则需要“当前用户”指示。 特定的用户名通常并不重要,但是它的状态(常规或root)才是重要的。 解决方案是使用颜色:红色shell提示输入root,绿色提示普通用户。 而且您将永远不会像常规那样接管root shell。


如果使用ssh连接到服务器,则需要区分本地外壳程序和远程外壳程序。 为此,您的shell提示应包含一个主机名,甚至更好-指示ssh连接。


Shell提示符可以显示最后一条命令的退出代码。 请记住,退出代码为零表示命令成功退出,非零表示命令成功退出。 您可以通过echo $?获得上一条命令的退出代码echo $? ,但输入所有内容都是一件漫长的事情。 让外壳显示不成功的退出。


如果您使用Git仓库,那么在shell提示符下查看存储库状态会很有用:当前分支和工作目录的状态。 您将在git statusgit branch命令上节省一些时间,并且不会提交到错误的分支。 是的,在脂肪储存库中,状态的计算可能会花费大量时间,但对我而言,不利因素超过了缺点。


有人在shell提示中添加了时钟,甚至在虚拟终端(tty)的名称中添加了时钟,或者在一些任意的波形上添加了时钟。 都是多余的。 最好为命令留出更多空间。


那就是我的shell提示符在不同条件下的样子:



您可以在屏幕截图中看到终端标题栏执行了类似的工作。 它也是仪表板的一部分,还应该进行配置。


那么,所有这些东西应该如何在.zshrc实现? PROMPT变量设置左提示,而RPROMPT设置右提示。 EUID变量定义用户(常规或root)的状态,并且SSH_CLIENTSSH2_CLIENT存在表示ssh连接。 所以我们可以有一个模板:


 if [[ -n "$SSH_CLIENT" || -n "$SSH2_CLIENT" ]]; then if [[ $EUID == 0 ]]; then PROMPT=... else PROMPT=... fi else # not SSH if [[ $EUID == 0 ]]; then PROMPT=... else PROMPT=... fi fi 

我不显示可复制粘贴的代码,因为确切的实现只取决于口味。 如果您不想打扰,并且上面的屏幕截图适合您,则可以从Github中获取我的cofig。


总结:


  • 彩色外壳提示是必须具备的。
  • 最低要求是当前工作目录。
  • 根壳应该清晰可见。
  • 如果您仅使用一个帐户,则用户名不在乎有效负载。
  • 如果通过ssh连接到服务器,则主机名很有用,如果不是,则不是必需的。
  • 查看最后一个命令的失败退出代码很有用。
  • Git回购状态节省了git statusgit branch命令的时间,并提供了万无一失的方法。

大量使用命令历史记录


您一生中大部分命令都会多次输入,因此将其从历史记录中拉出而不是再次键入很酷。 所有现代外壳程序都保存命令历史记录,并提供了几种搜索历史记录的方式。


也许您已经可以使用Ctrl + R键绑定来挖掘历史记录。 不幸的是,它有两个缺点:


  1. 命令行应该为空以开始搜索,例如,如果“一个人开始键入命令-记住了搜索”,则必须先清除输入内容,然后按Ctrl + R并重复输入。 太久了
  2. 由于Ctrl + S停止了终端,因此默认搜索无法进行正向搜索。

最快速,最方便的搜索类型通过以下方式工作:


  1. 您开始输入命令,
  2. 您还记得有关搜索的信息,
  3. 按下热键,shell将以相同的方式从历史记录中提供命令。

例如,您想使用Rsync将本地目录与远程目录同步,而您已经在两个小时前完成了。 键入rsync ,按热键一两次,即可启动所需的命令。 您无需先打开搜索模式,shell提示符不会更改为(reverse-i-search)': :,并且任何地方都不会跳动。 您只需按箭头↑↓滚动历史记录,即可滚动浏览先前输入的命令,但具有其他过滤功能。 真是太酷了,节省了很多时间。


默认情况下,这种搜索在Bash和Zsh中不起作用,因此您必须手动启用它。 我选择PgUp进行向前搜索,选择PgDown进行向后搜索。 距离他们很远,但是我已经养成了习惯。 也许以后我会切换到更接近的位置,例如Ctrl + P和Ctrl +N。


对于Bash,您需要在~/.inputrc /etc/inputrc中添加几个字符串:


 "\e[5~": history-search-backward "\e[6~": history-search-forward 

如果您使用了外国完整的.zshrc ,则很有可能PgUp和PgDown已经完成了该工作。 如果没有,则添加到~/.zshrc


 bindkey "^[[5~" history-beginning-search-backward # pg up bindkey "^[[6~" history-beginning-search-forward # pg down 

Fish和Ipython壳已经具有与箭头↑↓绑定的搜索。 我认为许多用户只是出于箭头行为而迁移到了Fish。 当然,如果需要,可以在Bash和Zsh中以这种方式绑定箭头。 在~/.inputrc /etc/inputrc~/.inputrc


 "\e[A":history-search-backward "\e[B":history-search-forward 

这在~/.zshrc


 autoload -U up-line-or-beginning-search autoload -U down-line-or-beginning-search zle -N up-line-or-beginning-search zle -N down-line-or-beginning-search bindkey "^[[A" up-line-or-beginning-search bindkey "^[[B" down-line-or-beginning-search 

奇怪的是,随着时间的流逝,我开始编写命令时会牢记,稍后我会将它们从历史中拉出来。 让我向您展示一些技巧。


加入始终相互遵循的命令


 # ip link set eth1 up && dhclient eth1 # mkdir /tmp/t && mount /dev/sdb1 /tmp/t 

绝对路径而不是相对路径使您可以从任何目录运行命令:
systemd-nspawn /home/chroot/stretch vim ~/.ssh/config代替systemd-nspawn /home/chroot/stretch vim .ssh/config ,用systemd-nspawn /home/chroot/stretch代替systemd-nspawn stretch等。


通配符的使用使您的命令更加通用。 我通常将它与chmodchown结合使用。


 # chown root:root /var/www/*.sq && chmod 644 /var/www/*.sq 

键盘快捷键


这是最低要求。


Alt +。 -替换上一个命令的最后一个参数。 也可以使用!$进行访问。
Ctrl + A,Ctrl + E-分别跳至该行的开头和结尾。
Ctrl + U,Ctrl + Y-剪切和粘贴。 当您键入复杂的命令并注意到需要首先执行另一个命令时,这非常方便。 嗯,在哪里保存当前输入? 就在这里
Ctrl + W-杀死光标前的一个单词。 按住不放会清除该行。 默认情况下,输入保存到剪贴板(用于Ctrl + Y)。
Ctrl + K-剪切光标后的部分行,将其添加到剪贴板。 Ctrl + A Ctrl + K快速清除该行。
PgUp,PgDown,Ctrl + R-历史记录搜索。
Ctrl + L清除终端。


键盘响应度


我想向您展示一个小的设置,使您可以更快地滚动,导航和擦除。 当我们要擦除大的东西时我们该怎么办? 我们按住Backspace并观察它向后擦字符。 到底是怎么回事? 按下Backspace键后,一个字符消失,然后经过一小段延迟,然后触发自动重复:Backspace一次又一次擦除字符,就像您反复按下它一样。


我建议您根据手指的速度调整延迟和自动重复频率。 如果您只想擦除一个字符,则需要延迟-它使您有时间释放键。 太大的延迟会使您等待自动重复。 这不足以让您感到烦恼,但足以减慢您的思想从头脑向计算机的转移。 自动重复频率越大,删除文本的速度就越快,停止此过程就越困难。 目的是找到最佳值。


因此,魔术命令是:


 $ xset r rate 190 20 

190-延迟持续时间(以毫秒为单位),
20-每秒重复的频率。


我建议从这些值开始,并逐渐增加延迟,直到出现误报,然后再返回一点。 如果延迟太小,您将无法使用键盘。 要解决此问题,应重新启动X服务器或完整的计算机。 所以,请小心。


为了保存参数,您需要在X自动启动的某处添加此命令。


流程退出指示


我经常不得不开始一些长期运行的过程:繁琐的备份,大数据传输,归档打包/提取,打包构建等等。 通常,我会启动这样一个过程,切换到另一个任务,如果我的长时间运行过程已经退出,则偶尔会凝视。 有时我会投入太多工作而忘了它。 解决方案是添加流程退出通知,这将使我摆脱困境。


有许多用于此目的的工具:通知发送,dzen2,蜂鸣,播放,隔离。 所有这些都以某种方式很好,但是不适用于ssh连接。 这就是为什么我使用终端提示音:


 $ long-running-command; echo $'\a' 

ASCII编码具有0x7字符,名为bell 。 它用于蜂鸣PC扬声器。 PC扬声器不是现代事物,不是每台计算机都具备,并且耳机中听不到。 这就是为什么某些终端使用所谓的可视铃。 我使用urxvt,它通过提高紧急标志来执行可视铃声。 怎么了 当窗口想告诉您紧急情况时,可以使用此功能。


您现在可以检查终端对铃声的反应:


 $ sleep 3; echo $'\a' 

您可能需要三秒钟才能切换到另一个窗口。


不幸的是,并非每个终端都可以通过提高紧急标志来显示可视铃声。 我检查了最受欢迎的。


终端模拟器可视铃作为紧急标志
康索尔可以在首选项中启用
urxvt是的
xfce4终端可以在首选项中启用
xterm没有啦
很酷的复古词没有啦
终端没有啦
侏儒终端没有啦

输入echo $'\a'太长echo $'\a' ,所以我做了一个wake别名。


别名


默认情况下, cpscprm命令是非递归工作的,这很糟糕! 这是该死的糟糕遗产! 好吧,可以使用别名对其进行修复。 但是首先让我们看看非递归行为何时有用。


 $ mkdir foodir $ cp * foodir 

仅文件将被复制到foodir ,而不是目录。 rm同样的情况:


 $ rm * 

将仅删除文件和符号链接,但保留目录。 但是,您多久需要一次此功能? 我喜欢认为cprm总是递归工作。


好的,但是安全性如何? 也许非递归行为可以保护您的文件? 在一种情况下,您有一个指向目录的符号链接,并且想要删除该符号链接,但保留目录。 如果在目录名后附加(有意或无意)斜杠,并且通过-r启用了递归模式,则目录将为空! 空!


 $ ln -s foodir dir_link $ rm -r dir_link/ 

如果没有-r arg,它将滥用并且不会删除任何内容。 因此,递归rm增加了丢失数据的风险。


我为cpscprm启用了递归模式,还为mkdir添加了-p来轻松创建嵌套目录。


 alias cp='cp -r' alias scp='scp -r' alias rm='rm -r' alias mkdir='mkdir -p' 

两年来,我从未为这些别名感到后悔,也从未丢失数据。 还有一个缺点:复制/删除的数据可能少于需要的数量,并且在没有别名的系统上工作时看不到它。 因此,请小心。 我知道我做什么,并总是谨慎地运行rm


最受欢迎的是ls别名,您可能已经在使用它们:


 alias ls='ls -F --color=auto' alias la='ls -A' alias ll='ls -lh' alias lla='ll -A' 

同样,彩色grep比无色grep更漂亮:


 alias grep='grep --colour=auto' 

别名在脚本中不起作用,请不要忘记这一事实! 您必须明确指定所有参数。


触摸打字


这很明显,但我提醒您:触摸打字有助于快速打字。 一开始会很困难,但是随着时间的推移,您将克服这些限制。


学习触摸打字的最佳时间是休假,没有人打扰您。 学习时请不要着急! 您的目标是记住每个角色的位置,而不是记住您的大脑,而是记住您的手指。 最好输入慢速,但不要输入错误,而不要输入有错误的快速输入。 请记住,大师们的成绩不是靠快速手指就能实现的,而不会犯错误。


不要忘记休息一下。 您的大脑和手指需要休息。 当错误开始出现时,这意味着您需要休息一下。


今天就这些


希望这些提示对您有所帮助。 祝你好运!

Source: https://habr.com/ru/post/zh-CN481940/


All Articles