轻松使用“Explain Shell”脚本来理解 Shell 命令

我们在Linux上工作时,每个人都会遇到需要查找shell命令的帮助信息的时候。 尽管内置的帮助像man pages、whatis命令有所助益, 但man pages的输出非常冗长, 除非是个有linux经验的人,不然从大量的man pages中获取帮助信息是非常困难的,而whatis命令的输出很少超过一行, 这对初学者来说是不够的。

轻松使用“Explain Shell”脚本来理解 Shell 命令
轻松使用“Explain Shell”脚本来理解 Shell 命令

在Linux Shell中解释Shell命令

有一些第三方应用程序, 像我们在Linux 用户的命令行速查表提及过的’cheat’命令。cheat是个优秀的应用程序,即使计算机没有联网也能提供shell命令的帮助, 但是它仅限于预先定义好的命令。

Jackson写了一小段代码,它能非常有效地在bash shell里面解释shell命令,可能最美之处就是你不需要安装第三方包了。他把包含这段代码的的文件命名为“explain.sh”。

explain.sh工具的特性

  • 易嵌入代码。
  • 不需要安装第三方工具。
  • 在解释过程中输出恰到好处的信息。
  • 需要网络连接才能工作。
  • 纯命令行工具。
  • 可以解释bash shell里面的大部分shell命令。
  • 无需使用root账户。

先决条件

唯一的条件就是’curl’包了。 在如今大多数Linux发行版里面已经预安装了curl包, 如果没有你可以按照下面的命令来安装。

# apt-get install curl  [On Debian systems]
# yum install curl      [On CentOS systems]

在Linux上安装explain.sh工具

我们要将下面这段代码插入’~/.bashrc’文件(LCTT译注: 若没有该文件可以自己新建一个)中。我们要为每个用户以及对应的’.bashrc’文件插入这段代码,但是建议你不要加在root用户下。

我们注意到.bashrc文件的第一行代码以(#)开始, 这个是可选的并且只是为了区分余下的代码。

#explain.sh 标记代码的开始, 我们将代码插入.bashrc文件的底部。

# explain.sh begins
explain () {
  if [ "$#" -eq 0 ]; then
    while read  -p "Command: " cmd; do
      curl -Gs "https://www.mankier.com/api/explain/?cols="$(tput cols) --data-urlencode "q=$cmd"
    done
    echo "Bye!"
  elif [ "$#" -eq 1 ]; then
    curl -Gs "https://www.mankier.com/api/explain/?cols="$(tput cols) --data-urlencode "q=$1"
  else
    echo "Usage"
    echo "explain                  interactive mode."
    echo "explain 'cmd -o | ...'   one quoted command to explain it."
  fi
}

explain.sh工具的使用

在插入代码并保存之后,你必须退出当前的会话然后重新登录来使改变生效(LCTT译注:你也可以直接使用命令source~/.bashrc 来让改变生效)。每件事情都是交由‘curl’命令处理, 它负责将需要解释的命令以及命令选项传送给mankier服务,然后将必要的信息打印到Linux命令行。不必说的就是使用这个工具你总是需要连接网络。

让我们用explain.sh脚本测试几个笔者不懂的命令例子。

1.我忘了‘du -h’是干嘛用的, 我只需要这样做:

$ explain 'du -h'
轻松使用“Explain Shell”脚本来理解 Shell 命令
轻松使用“Explain Shell”脚本来理解 Shell 命令

获得du命令的帮助

2.如果你忘了’tar -zxvf’的作用,你可以简单地如此做:

$ explain 'tar -zxvf'
轻松使用“Explain Shell”脚本来理解 Shell 命令
轻松使用“Explain Shell”脚本来理解 Shell 命令

Tar命令帮助

3.我的一个朋友经常对’whatis’以及’whereis’命令的使用感到困惑,所以我建议他:

在终端简单的地敲下explain命令进入交互模式。

$ explain

然后一个接着一个地输入命令,就能在一个窗口看到他们各自的作用:

Command: whatis
Command: whereis
轻松使用“Explain Shell”脚本来理解 Shell 命令
轻松使用“Explain Shell”脚本来理解 Shell 命令

Whatis/Whereis命令的帮助

你只需要使用“Ctrl+c”就能退出交互模式。

4. 你可以通过管道来请求解释更多的命令。

$ explain 'ls -l | grep -i Desktop'
轻松使用“Explain Shell”脚本来理解 Shell 命令
轻松使用“Explain Shell”脚本来理解 Shell 命令

获取多条命令的帮助

同样地,你可以请求你的shell来解释任何shell命令。 前提是你需要一个可用的网络。输出的信息是基于需要解释的命令,从服务器中生成的,因此输出的结果是不可定制的。

对于我来说这个工具真的很有用,并且它已经荣幸地添加在我的.bashrc文件中。你对这个项目有什么想法?它对你有用么?它的解释令你满意吗?请让我知道吧!

请在下面评论为我们提供宝贵意见,喜欢并分享我们以及帮助我们得到传播。


via: http://www.tecmint.com/explain-shell-commands-in-the-linux-shell/

作者:Avishek Kumar 译者:dingdongnigetou 校对:wxy

本文由 LCTT 原创翻译,Linux中国 荣誉推出

来源:https://linux.cn/article-5979-1.html

LINUX 101: 让你的 SHELL 更强大

在我们的关于 shell 基础的指导下, 得到一个更灵活,功能更强大且多彩的命令行界面

为何要这样做?

  • 使得在 shell 提示符下过得更轻松,高效
  • 在失去连接后恢复先前的会话
  • Stop pushing around that fiddly rodent!
LINUX 101: 让你的 SHELL 更强大
LINUX 101: 让你的 SHELL 更强大

这是我的命令行提示符的设置。对于这个小的终端窗口来说,这或许有些长。但你可以根据你的喜好来调整它。

作为一个 Linux 用户, 你可能熟悉 shell (又名为命令行)。 或许你需要时不时的打开终端来完成那些不能在 GUI 下处理的必要任务,抑或是因为你处在一个将窗口铺满桌面的环境中,而 shell 是你与你的 linux 机器交互的主要方式。

在上面那些情况下,你可能正在使用你所使用的发行版本自带的 Bash 配置。 尽管对于大多数的任务而言,它足够好了,但它可以更加强大。 在本教程中,我们将向你展示如何使得你的 shell 提供更多有用信息、更加实用且更适合工作。 我们将对提示符进行自定义,让它比默认情况下提供更好的反馈,并向你展示如何使用炫酷的 tmux 工具来管理会话并同时运行多个程序。 并且,为了让眼睛舒服一点,我们还将关注配色方案。那么,进击吧,少女!

让提示符更美妙

大多数的发行版本配置有一个非常简单的提示符,它们大多向你展示了一些基本信息, 但提示符可以为你提供更多的内容。例如,在 Debian 7 下,默认的提示符是这样的:

mike@somebox:~$

上面的提示符展示出了用户、主机名、当前目录和账户类型符号(假如你切换到 root 账户, $ 会变为 #)。 那这些信息是在哪里存储的呢? 答案是:在 PS1 环境变量中。 假如你键入 echo $PS1, 你将会在这个命令的输出字符串的最后有如下的字符:

u@h:w$

这看起来有一些丑陋,并在瞥见它的第一眼时,你可能会开始尖叫,认为它是令人恐惧的正则表达式,但我们不打算用这些复杂的字符来煎熬我们的大脑。这不是正则表达式,这里的斜杠是转义序列,它告诉提示符进行一些特别的处理。 例如,上面的 u 部分,告诉提示符展示用户名, 而 w 则展示工作路径.

下面是一些你可以在提示符中用到的字符的列表:

  • d 当前的日期
  • h 主机名
  • n 代表换行的字符
  • A 当前的时间 (HH:MM)
  • u 当前的用户
  • w (小写) 整个工作路径的全称
  • W (大写) 工作路径的简短名称
  • $ 一个提示符号,对于 root 用户为 # 号
  • ! 当前命令在 shell 历史记录中的序号

下面解释 wW 选项的区别: 对于前者,你将看到你所在的工作路径的完整地址,(例如 /usr/local/bin),而对于后者, 它则只显示 bin 这一部分。

现在,我们该怎样改变提示符呢? 你需要更改 PS1 环境变量的内容,试试下面这个:

export PS1="I am u and it is A $"

现在,你的提示符将会像下面这样:

I am mike and it is 11:26 $

从这个例子出发,你就可以按照你的想法来试验一下上面列出的其他转义序列。 但等等 – 当你登出后,你的这些努力都将消失,因为在你每次打开终端时,PS1 环境变量的值都会被重置。解决这个问题的最简单方式是打开 .bashrc 配置文件(在你的家目录下) 并在这个文件的最下方添加上完整的 export 命令。在每次你启动一个新的 shell 会话时,这个 .bashrc 会被 Bash 读取, 所以你的加强的提示符就可以一直出现。你还可以使用额外的颜色来装扮提示符。刚开始,这将有点棘手,因为你必须使用一些相当奇怪的转义序列,但结果是非常漂亮的。 将下面的字符添加到你的 PS1字符串中的某个位置,最终这将把文本变为红色:

[e[31m]

你可以将这里的 31 更改为其他的数字来获得不同的颜色:

  • 30 黑色
  • 32 绿色
  • 33 黄色
  • 34 蓝色
  • 35 洋红色
  • 36 青色
  • 37 白色

所以,让我们使用先前看到的转义序列和颜色来创造一个提示符,以此来结束这一小节的内容。深吸一口气,弯曲你的手指,然后键入下面这只“野兽”:

export PS1="(!) [e[31m] [A] [e[32m]u@h [e[34m]w [e[30m]$"

上面的命令提供了一个 Bash 命令历史序号、当前的时间、彩色的用户或主机名组合、以及工作路径。假如你“野心勃勃”,利用一些惊人的组合,你还可以更改提示符的背景色和前景色。非常有用的 Arch wiki 有一个关于颜色代码的完整列表:http://tinyurl.com/3gvz4ec

Shell 精要

假如你是一个彻底的 Linux 新手并第一次阅读这份杂志,或许你会发觉阅读这些教程有些吃力。 所以这里有一些基础知识来让你熟悉一些 shell。 通常在你的菜单中, shell 指的是 Terminal、 XTerm 或 Konsole, 当你启动它后, 最为实用的命令有这些:

ls (列出文件名); cp one.txt two.txt (复制文件); rm file.txt (移除文件); mv old.txt new.txt (移动或重命名文件);

cd /some/directory (改变目录); cd .. (回到上级目录); ./program (在当前目录下运行一个程序); ls > list.txt (重定向输出到一个文件)。

几乎每个命令都有一个手册页用来解释其选项(例如 man ls – 按 Q 来退出)。在那里,你可以知晓命令的选项,这样你就知道 ls -la 展示一个详细的列表,其中也列出了隐藏文件, 并且在键入一个文件或目录的名字的一部分后, 可以使用 Tab 键来自动补全。

Tmux: 针对 shell 的窗口管理器

在文本模式的环境中使用一个窗口管理器 – 这听起来有点不可思议, 是吧? 然而,你应该记得当 Web 浏览器第一次实现分页浏览的时候吧? 在当时, 这是在可用性上的一个重大进步,它减少了桌面任务栏的杂乱无章和繁多的窗口列表。 对于你的浏览器来说,你只需要一个按钮便可以在浏览器中切换到你打开的每个单独网站, 而不是针对每个网站都有一个任务栏或导航图标。 这个功能非常有意义。

若有时你同时运行着几个虚拟终端,你便会遇到相似的情况; 在这些终端之间跳转,或每次在任务栏或窗口列表中找到你所需要的那一个终端,都可能会让你觉得麻烦。 拥有一个文本模式的窗口管理器不仅可以让你像在同一个终端窗口中运行多个 shell 会话,而且你甚至还可以将这些窗口排列在一起。

另外,这样还有另一个好处:可以将这些窗口进行分离和重新连接。想要看看这是如何运行的最好方式是自己尝试一下。在一个终端窗口中,输入 screen (在大多数发行版本中,它已经默认安装了或者可以在软件包仓库中找到)。 某些欢迎的文字将会出现 – 只需敲击 Enter 键这些文字就会消失。 现在运行一个交互式的文本模式的程序,例如 nano, 并关闭这个终端窗口。

在一个正常的 shell 对话中, 关闭窗口将会终止所有在该终端中运行的进程 – 所以刚才的 Nano 编辑对话也就被终止了, 但对于 screen 来说,并不是这样的。打开一个新的终端并输入如下命令:

screen -r

瞧,你刚开打开的 Nano 会话又回来了!

当刚才你运行 screen 时, 它会创建了一个新的独立的 shell 会话, 它不与某个特定的终端窗口绑定在一起,所以可以在后面被分离并重新连接(即 -r 选项)。

当你正使用 SSH 去连接另一台机器并做着某些工作时, 但并不想因为一个脆弱的连接而影响你的进度,这个方法尤其有用。假如你在一个 screen 会话中做着某些工作,并且你的连接突然中断了(或者你的笔记本没电了,又或者你的电脑报废了——不是这么悲催吧),你只需重新连接或给电脑充电或重新买一台电脑,接着运行 screen -r 来重新连接到远程的电脑,并在刚才掉线的地方接着开始。

现在,我们都一直在讨论 GNU 的 screen,但这个小节的标题提到的是 tmux。 实质上, tmux (terminal multiplexer) 就像是 screen 的一个进阶版本,带有许多有用的额外功能,所以现在我们开始关注 tmux。 某些发行版本默认包含了 tmux; 在其他的发行版本上,通常只需要一个 apt-get、 yum installpacman -S 命令便可以安装它。

一旦你安装了它过后,键入 tmux 来启动它。接着你将注意到,在终端窗口的底部有一条绿色的信息栏,它非常像传统的窗口管理器中的任务栏: 上面显示着一个运行着的程序的列表、机器的主机名、当前时间和日期。 现在运行一个程序,同样以 Nano 为例, 敲击 Ctrl+B 后接着按 C 键, 这将在 tmux 会话中创建一个新的窗口,你便可以在终端的底部的任务栏中看到如下的信息:

0:nano- 1:bash*

每一个窗口都有一个数字,当前呈现的程序被一个星号所标记。 Ctrl+B 是与 tmux 交互的标准方式, 所以若你敲击这个按键组合并带上一个窗口序号, 那么就会切换到对应的那个窗口。你也可以使用 Ctrl+B 再加上 N 或 P 来分别切换到下一个或上一个窗口 – 或者使用 Ctrl+B 加上 L 来在最近使用的两个窗口之间来进行切换(有点类似于桌面中的经典的 Alt+Tab 组合键的效果)。 若需要知道窗口列表,使用 Ctrl+B 再加上 W。

目前为止,一切都还好:现在你可以在一个单独的终端窗口中运行多个程序,避免混乱(尤其是当你经常与同一个远程主机保持多个 SSH 连接时)。 当想同时看两个程序又该怎么办呢?

针对这种情况, 可以使用 tmux 中的窗格。 敲击 Ctrl+B 再加上 % , 则当前窗口将分为两个部分:一个在左一个在右。你可以使用 Ctrl+B 再加上 O 来在这两个部分之间切换。 这尤其在你想同时看两个东西时非常实用, – 例如一个窗格看指导手册,另一个窗格里用编辑器看一个配置文件。

有时,你想对一个单独的窗格进行缩放,而这需要一定的技巧。 首先你需要敲击 Ctrl+B 再加上一个 :(冒号),这将使得位于底部的 tmux 栏变为深橙色。 现在,你进入了命令模式,在这里你可以输入命令来操作 tmux。 输入 resize-pane -R 来使当前窗格向右移动一个字符的间距, 或使用 -L 来向左移动。 对于一个简单的操作,这些命令似乎有些长,但请注意,在 tmux 的命令模式(前面提到的一个分号开始的模式)下,可以使用 Tab 键来补全命令。 另外需要提及的是, tmux 同样也有一个命令历史记录,所以若你想重复刚才的缩放操作,可以先敲击 Ctrl+B 再跟上一个分号,并使用向上的箭头来取回刚才输入的命令。

最后,让我们看一下分离和重新连接 – 即我们刚才介绍的 screen 的特色功能。 在 tmux 中,敲击 Ctrl+B 再加上 D 来从当前的终端窗口中分离当前的 tmux 会话。这使得这个会话的一切工作都在后台中运行、使用 tmux a 可以再重新连接到刚才的会话。但若你同时有多个 tmux 会话在运行时,又该怎么办呢? 我们可以使用下面的命令来列出它们:

tmux ls

这个命令将为每个会话分配一个序号; 假如你想重新连接到会话 1, 可以使用 tmux a -t 1. tmux 是可以高度定制的,你可以自定义按键绑定并更改配色方案, 所以一旦你适应了它的主要功能,请钻研指导手册以了解更多的内容。

LINUX 101: 让你的 SHELL 更强大
LINUX 101: 让你的 SHELL 更强大

上图中, tmux 开启了两个窗格: 左边是 Vim 正在编辑一个配置文件,而右边则展示着指导手册页。

Zsh: 另一个 shell

选择是好的,但标准同样重要。 你要知道几乎每个主流的 Linux 发行版本都默认使用 Bash shell – 尽管还存在其他的 shell。 Bash 为你提供了一个 shell 能够给你提供的几乎任何功能,包括命令历史记录,文件名补全和许多脚本编程的能力。它成熟、可靠并文档丰富 – 但它不是你唯一的选择。

许多高级用户热衷于 Zsh, 即 Z shell。 这是 Bash 的一个替代品并提供了 Bash 的几乎所有功能,另外还提供了一些额外的功能。 例如, 在 Zsh 中,你输入 ls ,并敲击 Tab 键可以得到 ls 可用的各种不同选项的一个大致描述。 而不需要再打开 man page 了!

Zsh 还支持其他强大的自动补全功能: 例如,输入 cd /u/lo/bi 再敲击 Tab 键, 则完整的路径名 /usr/local/bin 就会出现(这里假设没有其他的路径包含 u, lobi 等字符)。 或者只输入 cd 再跟上 Tab 键,则你将看到着色后的路径名的列表 – 这比 Bash 给出的简单的结果好看得多。

Zsh 在大多数的主要发行版本上都可以得到了; 安装它后并输入 zsh 便可启动它。 要将你的默认 shell 从 Bash 改为 Zsh, 可以使用 chsh 命令。 若需了解更多的信息,请访问 www.zsh.org

“未来”的终端

你或许会好奇为什么包含你的命令行提示符的应用被叫做终端。 这需要追溯到 Unix 的早期, 那时人们一般工作在一个多用户的机器上,这个巨大的电脑主机将占据一座建筑中的一个房间, 人们通过某些线路,使用屏幕和键盘来连接到这个主机, 这些终端机通常被称为“哑终端”, 因为它们不能靠自己做任何重要的执行任务 – 它们只展示通过线路从主机传来的信息,并输送回从键盘的敲击中得到的输入信息。

今天,我们在自己的机器上执行几乎所有的实际操作,所以我们的电脑不是传统意义下的终端,这就是为什么诸如 XTerm、 Gnome Terminal、 Konsole 等程序被称为“终端模拟器” 的原因 – 他们提供了同昔日的物理终端一样的功能。事实上,在许多方面它们并没有改变多少。诚然,现在我们有了反锯齿字体,更好的颜色和点击网址的能力,但总的来说,几十年来我们一直以同样的方式在工作。

所以某些程序员正尝试改变这个状况。 Terminology (http://tinyurl.com/osopjv9), 它来自于超级时髦的 Enlightenment 窗口管理器背后的团队,旨在让终端步入到 21 世纪,例如带有在线媒体显示功能。你可以在一个充满图片的目录里输入 ls 命令,便可以看到它们的缩略图,或甚至可以直接在你的终端里播放视频。 这使得一个终端有点类似于一个文件管理器,意味着你可以快速地检查媒体文件的内容而不必用另一个应用来打开它们。

接着还有 Xiki (www.xiki.org),它自身的描述为“命令的革新”。它就像是一个传统的 shell、一个 GUI 和一个 wiki 之间的过渡;你可以在任何地方输入命令,并在后面将它们的输出存储为笔记以作为参考,并可以创建非常强大的自定义命令。用几句话是很能描述它的,所以作者们已经创作了一个视频来展示它的潜力是多么的巨大(请看 Xiki 网站的截屏视频部分)。

并且 Xiki 绝不是那种在几个月之内就消亡的昙花一现的项目,作者们成功地进行了一次 Kickstarter 众筹,在七月底已募集到超过 $84,000。 是的,你没有看错 – $84K 来支持一个终端模拟器。这可能是最不寻常的集资活动了,因为某些疯狂的家伙已经决定开始创办它们自己的 Linux 杂志 ……

下一代终端

许多命令行和基于文本的程序在功能上与它们的 GUI 程序是相同的,并且常常更加快速和高效。我们的推荐有: Irssi (IRC 客户端); Mutt (mail 客户端); rTorrent (BitTorrent); Ranger (文件管理器); htop (进程监视器)。 若给定在终端的限制下来进行 Web 浏览, Elinks 确实做的很好,并且对于阅读那些以文字为主的网站例如 Wikipedia 来说。它非常实用。

微调配色方案

在《Linux Voice》杂志社中,我们并不迷恋那些养眼的东西,但当你每天花费几个小时盯着屏幕看东西时,我们确实认识到美学的重要性。我们中的许多人都喜欢调整我们的桌面和窗口管理器来达到完美的效果,调整阴影效果、摆弄不同的配色方案,直到我们 100% 的满意(然后出于习惯,摆弄更多的东西)。

但我们倾向于忽视终端窗口,它理应也获得我们的喜爱,并且在 http://ciembor.github.io/4bit 你将看到一个极其棒的配色方案设计器,对于所有受欢迎的终端模拟器(XTerm, Gnome Terminal, Konsole 和 Xfce4 Terminal 等都是支持的应用。),它可以输出其设定。移动滑块直到你看到配色方案最佳, 然后点击位于该页面右上角的 得到方案 按钮。

相似的,假如你在一个文本编辑器,如 Vim 或 Emacs 上花费了很多的时间,使用一个精心设计的调色板也是非常值得的。 Solarized http://ethanschoonover.com/solarized 是一个卓越的方案,它不仅漂亮,而且因追求最大的可用性而设计,在其背后有着大量的研究和测试。


via: http://www.linuxvoice.com/linux-101-power-up-your-shell-8/

作者:Ben Everard 译者:FSSlc 校对:wxy

本文由 LCTT 原创翻译,Linux中国 荣誉推出

来源:https://linux.cn/article-5910-1.html

Linux:命令行艺术

Linux:命令行艺术
Linux:命令行艺术

流畅地使用命令行是一个常被忽略的技能,或被认为是神秘的奥义。但是,它会以明显而微妙的方式改善你作为工程师的灵活度和生产力。这是我在 Linux 上工作时发现的有用的命令行使用小窍门和笔记的精粹。有些小窍门是很基础的,而有些是相当地特别、复杂、或者晦涩难懂。这篇文章不长,但是如果你可以使用并记得这里的所有内容,那么你就懂得很多了。

其中大部分最初出现Quora上,但是考虑到兴趣所在,似乎更应该放到 Github 上,这里的人比我更能提出改进建议。如果你看到一个错误,或者更好的某种东西,请提交问题或 PR!(当然,提交前请看看必读小节和已有的 PR/Issue。)

必读

范围:

  • 本文是针对初学者和专业人员的,选题目标是覆盖面广(全都很重要)、有针对性(大多数情况下都给出具体实例)而简洁(避免不必要内容以及你能在其它地方轻松找到的离题的内容)。每个小窍门在某种情形下都很必需的,或者能比替代品大大节省时间。
  • 这是为 Linux 写的。绝大部分条目都可以同样应用到 MacOS(或者甚至 Cygwin)。
  • 主要针对交互式 Bash,尽管大多数小窍门也可以应用到其它 shell,以及常规 Bash 脚本。
  • 包括了“标准的”UNIX 命令以及那些需要安装的软件包(它们很重要,值得安装)。

注意:

  • 为了能在一篇文章内展示尽量多的东西,一些具体的信息会被放到引用页里。你可以使用 Google 来获得进一步的内容。(如果需要的话,)你可以使用 apt-get/
    1
    yum

    /

    1
    dnf

    /

    1
    pacman

    /

    1
    pip

    /

    1
    2
    3
    4
    5
    6
    7
    brew</b1>来安装这些新的程序。</li>
    <li>使用 <a href="http://explainshell.com/">Explainshell</a> 来获取命令、参数、管道等内容的解释。</li>
    </ul>
    <h2 id="toc_2">基础</h2>
    <ul>
    <li>
    <p>学习基本 Bash 技能。实际上,键入<b1>man bash

    ,然后至少浏览一遍所有内容;它很容易理解,没那么长。其它 shell 也不错,但是 Bash 很强大,而且到处都可以找到(如果在你自己的笔记本上学习 zsh、fish 之类,会在很多情形下受到限制,比如使用现存的服务器时)。

  • 至少学好一种基于文本的编辑器。理想的一个是 Vim(

    1
    vi

    ),因为在终端中编辑时随时都能找到它(即使大多数时候你在使用 Emacs、一个大型的 IDE、或一个现代的时髦编辑器)。

  • 学习怎样使用

    1
    2
    3
    4
    5
    6
    7
    man</b1>来阅读文档(好奇的话,用 <b1>man man</b1>来列出分区号,比如 1 是常规命令,5 是文件描述,8 用于管理员)。用 <b1>apropos</b1>找到帮助页。了解哪些命令不是可执行程序,而是 Bash 内置的,你可以用 <b1>help</b1>和 <b1>help -d</b1>得到帮助。</p>
    </li>
    <li>
    <p>学习使用 <b1>></b1>和 <b1><</b1>来进行输出和输入重定向,以及使用 <b1>|</b1>来管道重定向,学习关于 stdout 和 stderr 的东西。</p>
    </li>
    <li>
    <p>学习 <b1>*

    (也许还有

    1
    ?</b1>和 <b1>{

    1
    2
    3
    4
    }</b1>)文件通配扩展和应用,以及双引号 <b1>"</b1>和单引号 <b1>'</b1>之间的区别。(更多内容请参看下面关于变量扩展部分)。</p>
    </li>
    <li>
    <p>熟悉 Bash 作业管理:<b1>&

    ctrl-zctrl-c

    1
    jobs

    1
    fg

    1
    bg

    1
    2
    3
    4
    kill</b1>等等。</p>
    </li>
    <li>
    <p>掌握<b1>ssh

    ,以及通过

    1
    ssh-agent

    1
    2
    3
    4
    ssh-add</b1>等进行无密码验证的基础技能。</p>
    </li>
    <li>
    <p>基本的文件管理:<b1>ls</b1>和 <b1>ls -l

    (特别是,知道

    1
    ls -l

    各个列的意义),

    1
    less

    1
    head

    1
    tail</b1>和 <b1>tail -f

    (或者更好的

    1
    less +F

    ),

    1
    ln</b1>和 <b1>ln -s

    (知道硬链接和软链接的区别,以及硬链接相对于软链接的优势),

    1
    chown

    1
    chmod

    1
    du

    (用于查看磁盘使用率的快速摘要:

    1
    du -sk *

    )。文件系统管理:

    1
    df

    1
    mount

    1
    fdisk

    1
    mkfs

    1
    lsblk

  • 基本的网络管理:

    1
    ip</b1>或 <b1>ifconfig

    1
    dig

  • 熟知正则表达式,以及各种使用

    1
    grep

    /

    1
    egrep

    的选项。

    1
    -i

    1
    -o

    1
    2
    3
    4
    -A</b1>和 <b1>-B</b1>选项值得掌握。</p>
    </li>
    <li>
    <p>学会使用 <b1>apt-get

    1
    yum</b1>,<b1>dnf</b1>或 <b1>pacman

    (这取决于你的发行版)来查找并安装软件包。确保你可以用

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    pip</b1>来安装基于 Python 的命令行工具(下面的一些东西可以很容易地通过 <b1>pip</b1>安装)。</p>
    </li>
    </ul>
    <h2 id="toc_3">日常使用</h2>
    <ul>
    <li>
    <p>在Bash中,使用 <strong>tab</strong> 补完参数,使用 <strong>ctrl-r</strong> 来搜索命令历史。</p>
    </li>
    <li>
    <p>在Bash中,使用 <strong>ctrl-w</strong> 来删除最后的单词,使用 <strong>ctrl-u</strong> 来删除整行,返回行首。使用 <strong>alt-b</strong> 和 <strong>alt-f</strong> 来逐词移动,使用 <strong>ctrl-k</strong> 来清除到行尾的内容,以及使用 <strong>ctrl-l</strong> 清屏。参见 man readline 来查看 Bash 中所有默认的键盘绑定,有很多。例如,<strong>alt-.</strong> 可以循环显示先前的参数,而<strong>alt-</strong> 扩展通配。(LCTT 译注:关于 Bash 下的快捷键,可以参阅: <a href="https://linux.cn/article-5660-1.html">https://linux.cn/article-5660-1.html</a> )</p>
    </li>
    <li>
    <p>另外,如果你喜欢 vi 风格的键盘绑定,可以使用 set -o vi。</p>
    </li>
    <li>
    <p>要查看最近用过的命令,请使用 history 。 有许多缩写形式,比如 !$(上次的参数)和!!(上次的命令),虽然使用 ctrl-r 和 alt-. 更容易些。(LCTT 译注:关于历史扩展功能,可以参阅: <a href="https://linux.cn/article-5658-1.html">https://linux.cn/article-5658-1.html</a> )</p>
    </li>
    <li>
    <p>返回先前的工作目录: cd -</p>
    </li>
    <li>
    <p>如果你命令输入到一半,但是改变主意了,可以敲 <strong>alt-#</strong> 来添加一个 # 到开头,然后将该命令作为注释输入(或者使用快捷键 <strong>ctrl-a</strong>, <strong>#</strong>,<strong>enter</strong> 输入)。然后,你可以在后面通过命令历史来回到该命令。</p>
    </li>
    <li>
    <p>使用 xargs(或 parallel),它很强大。注意,你可以控制每行(-L)执行多少个项目,以及并行执行(-P)。如果你不确定它是否会做正确的事情,可以首先使用 xargs echo。同时,使用 -I{} 也很方便。样例:</p>
    <pre class="prettyprint ">  find . -name '*.py' | xargs grep some_function
      cat hosts | xargs -I{} ssh root@{} hostname
    </pre>
    </li>
    <li>
    <p>pstree -p 对于显示进程树很有帮助。</p>
    </li>
    <li>
    <p>使用 pgrep 和 pkill 来按名称查找进程或给指定名称的进程发送信号(-f 很有帮助)。</p>
    </li>
    <li>
    <p>掌握各种可以发送给进程的信号。例如,要挂起进程,可以使用 kill -STOP [pid]。完整的列表可以查阅 man 7 signal。</p>
    </li>
    <li>
    <p>如果你想要一个后台进程一直保持运行,使用 nohup 或 disown。</p>
    </li>
    <li>
    <p>通过 netstat -lntp 或 ss -plat 检查哪些进程在监听(用于 TCP,对 UDP 使用 -u 替代 -t)。</p>
    </li>
    <li>
    <p>lsof来查看打开的套接字和文件。</p>
    </li>
    <li>
    <p>在 Bash 脚本中,使用 set -x 调试脚本输出。尽可能使用严格模式。使用 set -e 在遇到错误时退出。也可以使用 set -o pipefail,对错误进行严格处理(虽然该话题有点微妙)。对于更复杂的脚本,也可以使用 trap。</p>
    </li>
    <li>
    <p>在 Bash 脚本中,子 shell(写在括号中的)是组合命令的便利的方式。一个常见的例子是临时移动到一个不同的工作目录,如:</p>
    <pre class="prettyprint ">  # 在当前目录做些事
      (cd /some/other/dir; other-command)
      # 继续回到原目录
    </pre>
    </li>
    <li>
    <p>注意,在 Bash 中有大量的各种各样的变量扩展。检查一个变量是否存在:${name:?error message}。例如,如果一个Bash脚本要求一个单一参数,只需写 input_file=${1:?usage: $0 input_file}。算术扩展:i=$(( (i + 1) % 5 ))。序列: {1..10}。修剪字符串:${var%suffix} 和 ${var#prefix}。例如,if var=foo.pdf ,那么 echo ${var%.pdf}.txt 会输出 foo.txt。</p>
    </li>
    <li>
    <p>命令的输出可以通过 <(some command) 作为一个文件来处理。例如,将本地的 /etc/hosts 和远程的比较:</p>
    <pre class="prettyprint ">  diff /etc/hosts <(ssh somehost cat /etc/hosts)
    </pre>
    </li>
    <li>
    <p>了解 Bash 中的&ldquo;嵌入文档&rdquo;,就像在 cat <<eof ... 中。</p>
    </li>
    <li>
    <p>在 Bash 中,通过:some-command >logfile 2>&1 同时重定向标准输出和标准错误。通常,要确保某个命令不再为标准输入打开文件句柄,而是将它捆绑到你所在的终端,添加 </dev/null 是个不错的做法。</p>
    </li>
    <li>
    <p>man ascii 可以得到一个不错的ASCII表,带有十六进制和十进制值两种格式。对于常规编码信息,man unicode,man utf-8 和 man latin1 将很有帮助。</p>
    </li>
    <li>
    <p>使用 screen 或 tmux 来复用屏幕,这对于远程 ssh 会话尤为有用,使用它们来分离并重连到会话。另一个只用于保持会话的最小可选方案是 dtach。</p>
    </li>
    <li>
    <p>在 ssh 中,知道如何使用 -L 或 -D(偶尔也用-R)来打开端口通道是很有用的,如从一台远程服务器访问网站时。</p>
    </li>
    <li>
    <p>为你的 ssh 配置进行优化很有用;例如,这个 ~/.ssh/config 包含了可以避免在特定网络环境中连接被断掉的情况的设置、使用压缩(这对于通过低带宽连接使用 scp 很有用),以及使用一个本地控制文件来开启到同一台服务器的多通道:</p>
    <pre class="prettyprint ">  TCPKeepAlive=yes
      ServerAliveInterval=15
      ServerAliveCountMax=6
      Compression=yes
      ControlMaster auto
      ControlPath /tmp/%r@%h:%p
      ControlPersist yes
    </pre>
    </li>
    <li>
    <p>其它一些与 ssh 相关的选项对会影响到安全,请小心开启,如各个子网或主机,或者在信任的网络中:StrictHostKeyChecking=no, ForwardAgent=yes</p>
    </li>
    <li>
    <p>要获得八进制格式的文件的权限,这对于系统配置很有用而用 ls 又没法查看,而且也很容易搞得一团糟,可以使用像这样的东西:</p>
    <pre class="prettyprint ">  stat -c '%A %a %n' /etc/timezone
    </pre>
    </li>
    <li>
    <p>对于从另一个命令的输出结果中交互选择值,可以使用<a href="https://github.com/mooz/percol">percol</a>。</p>
    </li>
    <li>
    <p>对于基于另一个命令(如git)输出的文件交互,可以使用fpp (<a href="https://github.com/facebook/PathPicker">路径选择器</a>)。</p>
    </li>
    <li>
    <p>要为当前目录(及子目录)中的所有文件构建一个简单的 Web 服务器,让网络中的任何人都可以获取,可以使用: python -m SimpleHTTPServer 7777 (使用端口 7777 和 Python 2)。</p>
    </li>
    </ul>
    <h2 id="toc_4">处理文件和数据</h2>
    <ul>
    <li>
    <p>要在当前目录中按名称定位文件,find . -iname '*something*'(或者相类似的)。要按名称查找任何地方的文件,使用 locate something(但请记住,updatedb 可能还没有索引最近创建的文件)。</p>
    </li>
    <li>
    <p>对于源代码或数据文件进行的常规搜索(要比 grep -r 更高级),使用 <a href="https://github.com/ggreer/the_silver_searcher">ag</a>。</p>
    </li>
    <li>
    <p>要将 HTML 转成文本:lynx -dump -stdin。</p>
    </li>
    <li>
    <p>对于 Markdown、HTML,以及各种类型的文档转换,可以试试 <a href="http://pandoc.org/">pandoc</a>。</p>
    </li>
    <li>
    <p>如果你必须处理 XML,xmlstarlet 虽然有点老旧,但是很好用。</p>
    </li>
    <li>
    <p>对于 JSON,使用jq。</p>
    </li>
    <li>
    <p>对于 Excel 或 CSV 文件,<a href="https://github.com/onyxfish/csvkit">csvkit</a> 提供了 in2csv,csvcut,csvjoin,csvgrep 等工具。</p>
    </li>
    <li>
    <p>对于亚马逊 S3 ,<a href="https://github.com/s3tools/s3cmd">s3cmd</a> 会很方便,而 <a href="https://github.com/bloomreach/s4cmd">s4cmd</a> 则更快速。亚马逊的 <a href="https://github.com/aws/aws-cli">aws</a> 则是其它 AWS 相关任务的必备。</p>
    </li>
    <li>
    <p>掌握 sort 和 uniq,包括 uniq 的 -u 和 -d 选项&mdash;&mdash;参见下面的单行程序。</p>
    </li>
    <li>
    <p>掌握 cut,paste 和 join,它们用于处理文本文件。很多人会使用 cut,但常常忘了 join。</p>
    </li>
    <li>
    <p>了解 tee,它会将 stdin 同时复制到一个文件和 stdout,如 ls -al | tee file.txt。</p>
    </li>
    <li>
    <p>知道 locale 会以微妙的方式对命令行工具产生大量的影响,包括排序的顺序(整理)以及性能。大多数安装好的 Linux 会设置 LANG 或其它 locale 环境变量为本地设置,比如像 US English。但是,你要明白,如果改变了本地环境,那么排序也将改变。而且 i18n 过程会让排序或其它命令的运行慢<em>好多倍</em>。在某些情形中(如像下面那样的设置操作或唯一性操作),你可以安全地整个忽略缓慢的 i18n 过程,然后使用传统的基于字节的排序顺序 export LC_ALL=C。</p>
    </li>
    <li>
    <p>了解基本的改动数据的 awk 和 sed 技能。例如,计算某个文本文件第三列所有数字的和:awk '{ x += $3 } END { print x }'。这可能比 Python 的同等操作要快3倍,而且要短3倍。</p>
    </li>
    <li>
    <p>在一个或多个文件中,替换所有出现在特定地方的某个字符串:</p>
    <pre class="prettyprint ">  perl -pi.bak -e 's/old-string/new-string/g' my-files-*.txt
    </pre>
    </li>
    <li>
    <p>要立即根据某个模式对大量文件重命名,使用 rename。对于复杂的重命名,<a href="https://github.com/jlevy/repren">repren</a> 可以帮助你达成。</p>
    <pre class="prettyprint ">  # 恢复备份文件 foo.bak -> foo:
      rename 's/.bak$//' *.bak
      # 完整的文件名、目录名 foo -> bar:
      repren --full --preserve-case --from foo --to bar .
    </pre>
    </li>
    <li>
    <p>使用 shuf 来从某个文件中打乱或随机选择行。</p>
    </li>
    <li>
    <p>了解 sort 的选项。知道这些键是怎么工作的(-t和-k)。特别是,注意你需要写-k1,1来只通过第一个字段排序;-k1意味着根据整行排序。</p>
    </li>
    <li>
    <p>稳定排序(sort -s)会很有用。例如,要首先按字段2排序,然后再按字段1排序,你可以使用 sort -k1,1 | sort -s -k2,2</p>
    </li>
    <li>
    <p>如果你曾经需要在 Bash 命令行中写一个水平制表符(如,用于 -t 参数的排序),按<strong>ctrl-v</strong> <strong>[Tab]</strong>,或者写$'t'(后面的更好,因为你可以复制/粘贴)。</p>
    </li>
    <li>
    <p>对源代码进行补丁的标准工具是 diff 和 patch。 用 diffstat 来统计 diff 情况。注意 diff -r 可以用于整个目录,所以可以用 diff -r tree1 tree2 | diffstat 来统计(两个目录的)差异。</p>
    </li>
    <li>
    <p>对于二进制文件,使用 hd 进行简单十六进制转储,以及 bvi 用于二进制编辑。</p>
    </li>
    <li>
    <p>还是用于二进制文件,strings(加上 grep 等)可以让你找出一点文本。</p>
    </li>
    <li>
    <p>对于二进制文件的差异(delta 压缩),可以使用 xdelta3。</p>
    </li>
    <li>
    <p>要转换文本编码,试试 iconv 吧,或者对于更高级的用途使用 uconv;它支持一些高级的 Unicode 的东西。例如,这个命令可以转换为小写并移除所有重音符号(通过扩展和丢弃):</p>
    <pre class="prettyprint ">  uconv -f utf-8 -t utf-8 -x '::Any-Lower; ::Any-NFD; [:Nonspacing Mark:] >; ::Any-NFC; ' < input.txt > output.txt
    </pre>
    </li>
    <li>
    <p>要将文件分割成几个部分,来看看 split(按大小分割)和 csplit(按格式分割)吧。</p>
    </li>
    <li>
    <p>使用 zless,zmore,zcat 和 zgrep 来操作压缩文件。</p>
    </li>
    </ul>
    <h2 id="toc_5">系统调试</h2>
    <ul>
    <li>
    <p>对于 Web 调试,<b1>curl</b1>和 <b1>curl -I</b1>很方便灵活,或者也可以使用它们的同行 <b1>wget

    ,或者更现代的

    1
    httpie

  • 要了解磁盘、CPU、网络的状态,使用

    1
    iostat

    1
    netstat

    1
    top

    (或更好的

    1
    htop

    )和(特别是)

    1
    dstat

    。它们对于快速获知系统中发生的状况很好用。

  • 对于更深层次的系统总览,可以使用

    1
    glances

    。它会在一个终端窗口中为你呈现几个系统层次的统计数据,对于快速检查各个子系统很有帮助。

  • 要了解内存状态,可以运行

    1
    free</b1>和 <b1>vmstat

    ,看懂它们的输出结果吧。特别是,要知道“cached”值是Linux内核为文件缓存所占有的内存,因此,要有效地统计“free”值。

  • Java 系统调试是一件截然不同的事,但是对于 Oracle 系统以及其它一些 JVM 而言,不过是一个简单的小把戏,你可以运行

    1
    kill -3 <pid>

    ,然后一个完整的堆栈追踪和内存堆的摘要(包括常规的垃圾收集细节,这很有用)将被转储到stderr/logs。

  • 使用

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    mtr</b1>作路由追踪更好,可以识别网络问题。</p>
    </li>
    <li>
    <p>对于查看磁盘满载的原因,<b1>ncdu</b1>会比常规命令如 <b1>du -sh *</b1>更节省时间。</p>
    </li>
    <li>
    <p>要查找占用带宽的套接字和进程,试试 <b1>iftop</b1>或 <b1>nethogs</b1>吧。</p>
    </li>
    <li>
    <p>(Apache附带的)<b1>ab

    工具对于临时应急检查网络服务器性能很有帮助。对于更复杂的负载测试,可以试试

    1
    siege

  • 对于更仔细的网络调试,可以用

    1
    wireshark

    1
    tshark</b1>或 <b1>ngrep

  • 掌握

    1
    strace</b1>和 <b1>ltrace

    。如果某个程序失败、挂起或崩溃,而你又不知道原因,或者如果你想要获得性能的大概信息,这些工具会很有帮助。注意,分析选项(

    1
    -c

    )和使用

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    -p</b1>关联运行进程。</p>
    </li>
    <li>
    <p>掌握 <b1>ldd</b1>来查看共享库等。</p>
    </li>
    <li>
    <p>知道如何使用 <b1>gdb</b1>来连接到一个运行着的进程并获取其堆栈追踪信息。</p>
    </li>
    <li>
    <p>使用 <b1>/proc

    。当调试当前的问题时,它有时候出奇地有帮助。样例:

    1
    /proc/cpuinfo

    1
    /proc/xxx/cwd

    1
    /proc/xxx/exe

    1
    /proc/xxx/fd/

    1
    /proc/xxx/smaps

  • 当调试过去某个东西为何出错时,

    1
    2
    3
    4
    sar</b1>会非常有帮助。它显示了 CPU、内存、网络等的历史统计数据。</p>
    </li>
    <li>
    <p>对于更深层的系统和性能分析,看看 <b1>stap</b1>(<a href="https://sourceware.org/systemtap/wiki">SystemTap</a>),<a href="http://en.wikipedia.org/wiki/Perf_(Linux"><code>perf

    ) 和

    1
    sysdig

    吧。

  • 确认是正在使用的 Linux 发行版版本(支持大多数发行版):

    1
    lsb_release -a

  • 每当某个东西的行为异常时(可能是硬件或者驱动器问题),使用

    1
    dmesg

单行程序

这是将命令连成一行的一些样例:

  • 有时候通过 sort/uniq 对文本文件做交集、并集和差集运算时,这个例子会相当有帮助。假定 a 和 b 是已经进行了唯一性处理的文本文件。这会很快,而且可以处理任意大小的文件,总计可达数千兆字节。(Sort不受内存限制,不过如果 /tmp 放在一个很小的根分区的话,你可能需要使用 -T 选项。)也可参见上面关于LC_ALL的注解和 -u 选项(参见下面例子更清晰)。
    sh cat a b | sort | uniq > c # c 是 a 和 b 的并集
    cat a b | sort | uniq -d > c # c 是 a 和 b 的交集
    cat a b b | sort | uniq -u > c # c 是 a 减去 b 的差集
  • 使用 grep . * 来可视化查看一个目录中的所有文件的所有内容,例如,对于放满配置文件的目录: /sys, /proc, /etc。

  • 对某个文本文件的第三列中所有数据进行求和(该例子可能比同等功能的Python要快3倍,而且代码也少于其3倍):

      awk '{ x += $3 } END { print x }' myfile
    
  • 如果想要查看某个文件树的大小/日期,该例子就像一个递归ls -l,但是比ls -lR要更容易读懂:

      find . -type f -ls
    
  • 只要可以,请使用 xargs 或 parallel。注意,你可以控制每行(-L)执行多少个项目,以及并行执行(-P)。如果你不确定它是否会做正确的事情,可以首先使用 xargs echo。同时,使用 -I{} 也很方便。样例:

      find . -name '*.py' | xargs grep some_function
      cat hosts | xargs -I{} ssh root@{} hostname
    
  • 比如说,你有一个文本文件,如 Web 服务器的日志,在某些行中出现了某个特定的值,如 URL 中出现的 acct_id 参数。如果你想要统计有多少个 acct_id 的请求:

    cat access.log | egrep -o 'acct_id=[0-9]+' | cut -d= -f2 | sort | uniq -c | sort -rn
    
  • 运行该函数来获得来自本文的随机提示(解析Markdown并从中提取某个项目):

    function taocl() {
        curl -s https://raw.githubusercontent.com/jlevy/the-art-of-command-line/master/README.md |
          pandoc -f markdown -t html |
          xmlstarlet fo --html --dropdtd |
          xmlstarlet sel -t -v "(html/body/ul/li[count(p)>0])[$RANDOM mod last()+1]" |
          xmlstarlet unesc | fmt -80
      }
    

晦涩难懂,但却有用

  • expr:实施算术或布林操作,或者求正则表达式的值

  • 1
    m4

    :简单的宏处理器

  • 1
    yes

    :大量打印一个字符串

  • 1
    cal

    :漂亮的日历

  • 1
    env

    :(以特定的环境变量设置)运行一个命令(脚本中很有用)

  • 1
    look

    :查找以某个字符串开头的英文单词(或文件中的行)

  • 1
    cut</b1>和 <b1>paste</b1>以及 <b1>join

    :数据处理

  • 1
    fmt

    :格式化文本段落

  • 1
    pr

    :格式化文本为页/列

  • 1
    fold

    :文本折行

  • 1
    column

    :格式化文本为列或表

  • 1
    expand</b1>和 <b1>unexpand

    :在制表符和空格间转换

  • 1
    nl

    :添加行号

  • 1
    seq

    :打印数字

  • 1
    bc

    :计算器

  • 1
    factor

    :分解质因子

  • 1
    gpg

    :加密并为文件签名

  • 1
    toe

    :terminfo 条目表

  • 1
    nc

    :网络调试和数据传输

  • 1
    socat

    :套接字中继和 tcp 端口转发(类似

    1
    netcat

  • 1
    slurm

    :网络流量可视化

  • 1
    dd

    :在文件或设备间移动数据

  • 1
    file

    :识别文件类型

  • 1
    tree

    :以树形显示目录及子目录;类似

    1
    ls

    ,但是是递归的。

  • 1
    stat

    :文件信息

  • 1
    tac

    :逆序打印文件

  • 1
    shuf

    :从文件中随机选择行

  • 1
    comm

    :逐行对比分类排序的文件

  • 1
    hd

    1
    bvi

    :转储或编辑二进制文件

  • 1
    strings

    :从二进制文件提取文本

  • 1
    tr

    :字符转译或处理

  • 1
    iconv

    1
    uconv

    :文本编码转换

  • 1
    split

    1
    csplit

    :分割文件

  • 1
    units

    :单位转换和计算;将每双周(fortnigh)一浪(浪,furlong,长度单位,约201米)转换为每瞬(blink)一缇(缇,twip,一种和屏幕无关的长度单位)(参见: /usr/share/units/definitions.units)(LCTT 译注:这都是神马单位啊!)

  • 1
    7z

    :高比率文件压缩

  • 1
    ldd

    :动态库信息

  • 1
    nm

    :目标文件的符号

  • 1
    ab

    :Web 服务器基准测试

  • 1
    strace

    :系统调用调试

  • 1
    mtr

    :用于网络调试的更好的路由追踪软件

  • 1
    cssh

    :可视化并发 shell

  • 1
    rsync

    :通过 SSH 同步文件和文件夹

  • 1
    wireshark</b1>和 <b1>tshark

    :抓包和网络调试

  • 1
    ngrep

    :从网络层摘取信息

  • 1
    host</b1>和 <b1>dig

    :DNS查询

  • 1
    lsof

    :处理文件描述符和套接字信息

  • 1
    dstat

    :有用的系统统计数据

  • 1
    glances

    :高级,多个子系统概览

  • 1
    iostat

    :CPU和磁盘使用率统计

  • 1
    htop

    :top的改进版

  • 1
    last

    :登录历史

  • 1
    w

    :谁登录进来了

  • 1
    id

    :用户/组身份信息

  • 1
    sar

    :历史系统统计数据

  • 1
    iftop

    1
    nethogs

    :按套接口或进程的网络使用率

  • 1
    ss

    :套接口统计数据

  • 1
    dmesg

    :启动和系统错误信息

  • 1
    hdparm

    :SATA/ATA 磁盘操作/改善性能

  • 1
    lsb_release

    :Linux 发行版信息

  • 1
    lsblk

    :列出块设备,以树形展示你的磁盘和分区

  • 1
    lshw

    :硬件信息

  • 1
    fortune

    1
    ddate</b1>和 <code>sl

    :嗯,好吧,它取决于你是否认为蒸汽机车和 Zippy 引用“有用”

更多资源

免责声明

除了非常小的任务外,其它都写出了代码供大家阅读。伴随力量而来的是责任。事实是,你在Bash中做的,并不意味着是你所应该做的!;)


via: https://github.com/jlevy/the-art-of-command-line

作者:jlevy 译者:GOLinux 校对:wxy

本文由 LCTT 原创翻译,Linux中国 荣誉推出

来源:https://linux.cn/article-5703-1.html

Linux:给 man pages 设置颜色

Linux提供了丰富的帮助手册,当你需要查看某个命令的参数时不必到处上网查找,只要man一下即可。在windows中F1可能不经常用,但在linux中man命令可是比不可少的。

默认的man pages 只有一种颜色,有些文字是进行加粗的,习惯了vim的颜色高亮显示,man pages显得单调很多:

点击查看原始大图

方法比较简单:

打开/etc/bash.bashrc(需要root权限)或者~/.bashrc文件加入如下内容:

# Set colors for man pages
man() {
  env \
  LESS_TERMCAP_mb=$(printf "\e[1;31m") \
  LESS_TERMCAP_md=$(printf "\e[1;31m") \
  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 "$@"
}

重新打开终端,现在执行man就有颜色了。

该脚本其实定义了一个man函数,每次我们执行man的时候都是执行的该函数。如果执行原始的man运行/usr/bin/man 即可。

来自LinuxDeepin博客,并进行一定的修改。

来自:http://www.ubuntuhome.com/man-pages-set-color.html

 

 

Linux:Linux 下架设 rsync 服务器

  rsync 是一个Unix系统下的文件同步和传输工具。rsync是用 “rsync 算法”提供了一个客户机和远程文件服务器的文件同步的快速方法。

rsync 包括如下的一些特性:

  • * can update whole directory trees and filesystems 能更新整个目录和树和文件系统;
  • * optionally preserves symbolic links, hard links, file ownership, permissions, devices and times 有选择性的保持符号链链、硬链接、文件属于、权限、设备以及时间等;
  • * requires no special privileges to install 对于安装来说,无任何特殊权限要求;
  • * internal pipelining reduces latency for multiple files 对于多个文件来说,内部流水线减少文件等待的延时;
  • * can use rsh, ssh or direct sockets as the transport 能用rsh、ssh 或直接端口做为传输入端口;
  • * supports anonymous rsync which is ideal for mirroring 支持匿名rsync 同步文件,是理想的镜像工具;

安装配置过程:

一、建相应的文件及文件夹

[root@estals60:~]#mkdir /etc/rsyncd  --在/etc目录下创建一个rsyncd的目录,我们用来存放rsyncd.conf 和rsyncd.secrets文件;
[root@estals60:~]#touch /etc/rsyncd/rsyncd.conf  --创建rsyncd.conf ,这是rsync服务器的配置文件;
[root@estals60:~]#touch /etc/rsyncd/rsyncd.secrets --创建rsyncd.secrets ,这是用户密码文件;
[root@estals60:~]#chmod 600 /etc/rsyncd/rsyncd.secrets  --为了密码的安全性,我们把权限设为600;
[root@estals60:~]#ls -lh /etc/rsyncd/rsyncd.secrets
-rw------- 1 root root 14 2007-07-15 10:21 /etc/rsyncd/rsyncd.secrets
[root@estals60:~]#touch /etc/rsyncd/rsyncd.motd

  二、修改 rsyncd.conf 和rsyncd.secrets 和rsyncd.motd

rsyncd.conf 是rsync服务器主要配置文件,我们来个简单的示例;

比如我们要备份服务器上的 /nsn_talko_production/talko/var/www/html/Talko/talko.next/repository/

# Minimal configuration file for rsync daemon
# See rsync(1) and rsyncd.conf(5) man pages for help
# This line is required by the /etc/init.d/rsyncd script
pid file = /var/run/rsyncd.pid
port = 873
address = estals60
#uid = nobody
#gid = nobody
uid = root
gid = root
use chroot = yes
read only = yes

#limit access to private LANs
hosts allow=* #192.168.1.0/255.255.255.0 10.0.1.0/255.255.255.0
#hosts deny=*
max connections = 5
motd file = /etc/rsyncd/rsyncd.motd

#This will give you a separate log file
#log file = /var/log/rsync.log
#This will log every file transferred - up to 85,000+ per user, per sync
#transfer logging = yes
log format = %t %a %m %f %b
syslog facility = local3
timeout = 300
[P_repositor]
path = /nsn_talko_production/talko/var/www/html/Talko/talko.next/repository/
list=yes      --list 意思是把rsync 服务器上提供同步数据的目录在服务器上模块是否显示列出来。默认是yes 。如果你不想列出来,就no ;如果是no是比较安全的,至少别人不知道你的服务器上提供了哪些目录。你自己知道就行了
ignore errors                               --忽略IO错误
auth users = root                           --用户账号 (这个必须得是系统中已经存在的账号)
secrets file = /etc/rsyncd/rsyncd.secrets   --存放密码的地方
comment = P_repositor          --相当于是一种接口名字,等服务跑起来了客户端可以直接用这名字调用相关服务器的文件夹内容信息
#exclude =   beinan/  samba/    --无视这两个文件夹的内容

rsyncd.secrets的内容如下类似

root:123456 yofee:123456

rsyncd.motd 文件

  它是定义rysnc 服务器信息的,也就是用户登录信息。比如让用户知道这个服务器是谁提供的等。

+++++++++++++++++++++++++++
+ Yofee Packages rsync    +
+++++++++++++++++++++++++++

三、启动rsync服务器

[root@estals60:~]#/usr/bin/rsync –daemon  –config=/etc/rsyncd/rsyncd.conf

四、防火墙的设置

[root@estals60:~]#iptables -A INPUT -p tcp -m state –state NEW  -m tcp –dport 873 -j ACCEPT [root@estals60:~]#iptables -L  查看一下防火墙是不是打开了 873端口;

五、执行同步命令

rsync -avzP root@estals60::P_repositor /nsn_talko/talko/var/www/html/Talko/talko.next/

这时会要求输入root的密码,然后就没啥问题了。

另外其实也可以考虑把他建在系统任务里面定时运行。道理都是一样的,用crontab,这里就不再重述了。

######################
uid = nobody
gid = nobody
use chroot = no
read only = false
max connections = 5
port = 873
motd file = /etc/rsyncd/rsyncd.motd
pid file = /tmp/rsyncd.pid
lock file = /tmp/rsync.lock
log format = %t %a %m %f %b
log file = /tmp/rsyncd.log
timeout = 300

[update]
path = /data/autoupdate/
ignore errors = yes
list = false
comment = update
secrets file = /etc/rsyncd/rsyncd.secrets
hosts allow = *
#hosts deny = 0.0.0.0/32
###########################################

来自:http://wangwei007.blog.51cto.com/68019/1157898

Linux:Linux压缩那些事儿

Linux的压缩命令的源文件只能有一个,这意味在压缩之前不得不先将要压缩的所有文件打包成一个包,然后再压缩包,这样来完成对多个文件的压缩。所以在了解解压缩之前就必须先了解打包命令。

Linux的打包一般都是通过tar命令来完成的,通过man tar,可以得到一些信息,tar来完成不同的动作是通过指定不同的参数来完成的,通常使用的也就是——x/c,这两个参数,它们的字面含义是c——create,x——extract,创建和分包提取,另外还有一些不常用的参数,比如a,将tar添加到另外一个tar包的末尾,t,列出包中的文件,-C,将工作目录切换到指定的目录下,指定这个参数就可以将解压后的文件放到指定的目录当中去了,等。另外有一个重要的参数f,这个参数可以打包的结果放在一个文件当中。

下面举两个简单的例子说明打包和分包提取:

1.打包文件,现在有3个文件,文件名分别是fiel1,file2,file3,把这三个文件打包成file.tar.

tar -cf file.tar file1 file2 file3

-c,打包模式,-f指定将要创建的打包结果存放文件。

2.解包文件,现在有一个包file.tar,将它解包。

tar -xf file.tar

-x,解包模式,-f指定tar包文件。

讲完打包,接着将压缩,压缩的作用毋庸置疑,一旦一件事物变的更为简单之后,各方面的操作就更为简单,Linux的压缩一般有几种方式,它们是gzip压缩,bzip2压缩,xz压缩。它们的输入都只有一个,下面讲一个实例,分别用这三种压缩方式来压缩file.tar,然后压缩好的压缩文件再分别用这三种方式解压,生成xfile.tar,由于分别对单纯的解压和压缩并不是本文的重点,所以有些参数就不着重介绍,但需要的时候会简单的介绍下。

1.用gzip操作

压缩:gzip file.tar (如想将文件压缩到指定的文件当中去,可用”gzip -c file.tar > xxx”,来完成,以下相同)

解压:gunzip -c file.tar.gz > xfile.tar

2.用bzip2操作

压缩:bzip2 -c file.tar > xifle.tar.bz2

解压:bunzip2 -cv xfile.tar.bz2 > xfile.tar

3.用xz操作

压缩:xz -c file.tar > xfile.tar.xz

解压:unxz -c xfile.tar.xz > xfile.tar

对于压缩来讲,压缩率显然是首要关注点,就压缩率而言,xz>bzip2>gzip,一般情况下xz能比bzip2高出15%的压缩率,比gzip高出30%的压缩率,但是另外的有一些东西在具体的场合下还是需要关心的,比如CPU占有率,xz虽然压缩比高,但是它的耗时却是最多的,这意味着占用了更多的CPU时间片,所以在选择压缩算法的时候还应该考虑到现在的首要关注点是什么,以此来选择压缩算法。

上面分别讲解了打包和解压缩这两个过程,但这两个过程是分开的,在通常情况下,这两个过程不会分开,而是用tar包一步将多个文件打包压缩成一个压缩包,下面将分别使用tar命令调用这三种压缩方式来完成一步将多个文件打包压缩成一个压缩包。

1.用tar调用gzip将file1,file2,file3生成压缩包

tar -czvf file.tar.gz file{1,2,3}

2.用tar调用bzip2将file1,file2,file3生成压缩包

tar -cjvf file.tar.bz2 file{1,2,3}

3.用tar调用xz将file1,file2,file3生成压缩包

tar -cJvf file.tar.xz file{1,2,3}

对于上面的文字,有点需要注意,那就是后缀名并不是必须的,Linux当中后缀名都不是必须的,这应该是一个基础点,之所以指定后缀名是为了便于区别,也方便一些粗糙的识别程序。

阅读完上面的文字,我相信对Linux的压缩应该有一定程度的掌握,其实最重要的还是要学会阅读man page,里面应有尽有,只是过全就会过于复杂,不太适合初学者

via 51CTO

该贴已经同步到 linux的微博

Linux:Tmux:终端复用器

Tmux 是一个 C 语言编写的终端,它能够在单一窗口中同时访问和控制多个终端。它是一个类似于 GNU Screen 的工具。使用它,用户可以在 Linux 系统上管理多个任务和命令行程序,而不用同时打开多个终端窗口,Tmux 还可以切换到后台在需要的时候在调用到前台来。

在 Debian 和 Ubuntu 下安装 Tmux 的命令:

sk@sk:~$ sudo apt-get install tmux

在 CentOS 和 RHEL 中,它不存在于官方的软件源中,所以需要添加 EPEL 库。添加命令:

[root@server ~]# rpm -ivh http://dl.fedoraproject.org/pub/epel/6/i386/epel-release-6-8.noarch.rpm

添加完毕后,可以用下面的命令来安装它:

[root@server ~]# yum install tmux

安装完毕后,只需要执行如下命令就可以使用它了:

[root@server ~]# tmux

执行这个命令后,您将会被转移到 Tmux 的会话中。转移到会话中后,您需要先按下 Ctrl+B 才能执行其他的命令。您可以先按下 Ctrl+B 后按 “?” 来查看所有支持的命令。

Linux:Tmux:终端复用器
Linux:Tmux:终端复用器

建立一个新 Tmux 会话命令:

先按下 Ctrl+B 后在按下 “c“,您将建立一个新的会话。

Linux:Tmux:终端复用器
Linux:Tmux:终端复用器

在新的会话界面,您可以在底部看到绿色的 Tmux 会话记录,* 号标记的会话表示当前的会话。

您可以在所列出的会话之间切换,按下 Ctrl+B 然后在按 “w“,然后使用箭头来移动到你需要的会话,然后在回车,就可以切换到相应的会话中。如果要退出当前的会话,只需要键入”exit“命令即可。

Linux:Tmux:终端复用器
Linux:Tmux:终端复用器

如果您想拆分两个会话窗口,可以按下 Ctrl+B 后在按下 “%” 来实现。

Linux:Tmux:终端复用器
Linux:Tmux:终端复用器

要从会话脱离,可以按下 Ctrl+B 后接着按 “d” 。将脱离所有的会话返回原来的终端屏幕。

如果要恢复脱离的会话,您可以输入如下命令来恢复:

[root@server ~]# tmux attach

这样,你将恢复链接到原来的会话中。

更详细的使用命令,可以查看 Tmux 的 man 来得到。

[root@server ~]# man tmux

试试这个工具吧。

来源:https://linux.cn/article-1573-1.html

Linux:显示日历信息的命令 cal 和 ncal

  Linux 里内置两个用来显示和校准日历的命令 cal 和 ncal。一旦你习惯使用它们,你会发现使用命令很多时候都比你运用鼠标在 GUI 的日历里查看要来的更迅速和方便。命令行下,有许多参数,这些参数能完成您所需要的所有关于日历的需求,目前来说,我还没有发现我需要显示的一种日历的需求是它没有的,哈。

  下面,我就来和大家一起学习学习这些命令,这些命令我都在 Ubuntu Linux 日常使用:

问1、如何显示当前月份的信息

答:直接使用 cal 命令就可以,不需要添加任何参数

$ cal
     July 2013
Su Mo Tu We Th Fr Sa
    1  2  3  4  5  6
 7  8  9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31

  当然,您使用 ncal 也会得到同样的效果:

$ ncal
    July 2013         
Su     7 14 21 28   
Mo  1  8 15 22 29   
Tu  2  9 16 23 30   
We  3 10 17 24 31   
Th  4 11 18 25      
Fr  5 12 19 26      
Sa  6 13 20 27

  您可以看到整个当前月份的日历,当天日期是高亮显示的,您可以使用 -h 参数来关闭高亮。

问2、如何竖向排列日期

答:使用 ncal 命令同时添加 -J 参数

$ ncal -J
    July 2013
Su  1  8 15 22 29
Mo  2  9 16 23 30
Tu  3 10 17 24 31
We  4 11 18 25
Th  5 12 19 26
Fr  6 13 20 27
Sa  7 14 21 28

问3、想查询复活节日期

答:使用 ncal 命令添加 -e 参数

$ ncal -e
31 March 2013

问4、怎么显示 Julian 日历

答:使用 cal 命令添加 -j 参数

$ cal -j
         July 2013
 Su  Mo  Tu  We  Th  Fr  Sa
    182 183 184 185 186 187
188 189 190 191 192 193 194
195 196 197 198 199 200 201
202 203 204 205 206 207 208
209 210 211 212

问5、如何显示指定月份日历

答:使用 cal 命令添加 -m 参数和月份

$ cal -m1
    January 2013
Su Mo Tu We Th Fr Sa
       1  2  3  4  5
 6  7  8  9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31

  默认情况下,您添加的 -m参数和月份为当年的月份,如果您希望看到指定的某个年的月份,您可以在后面添加四位数字的年份。

$ cal -m1 1999
    January 1999
Su Mo Tu We Th Fr Sa
                1  2
 3  4  5  6  7  8  9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
31

问6、如何同时显示前一个月本月和下一个月三个月的日历

答:使用 cal 命令添加 -3 参数

$ cal -3
     June 2013             July 2013            August 2013
Su Mo Tu We Th Fr Sa  Su Mo Tu We Th Fr Sa  Su Mo Tu We Th Fr Sa
                   1      1  2  3  4  5  6               1  2  3
 2  3  4  5  6  7  8   7  8  9 10 11 12 13   4  5  6  7  8  9 10
 9 10 11 12 13 14 15  14 15 16 17 18 19 20  11 12 13 14 15 16 17
16 17 18 19 20 21 22  21 22 23 24 25 26 27  18 19 20 21 22 23 24
23 24 25 26 27 28 29  28 29 30 31           25 26 27 28 29 30 31
30

  同样道理,您可以查看任意三个月的日历:

$ cal -3 -m3 1984
   February 1984           March 1984            April 1984
Su Mo Tu We Th Fr Sa  Su Mo Tu We Th Fr Sa  Su Mo Tu We Th Fr Sa
          1  2  3  4               1  2  3   1  2  3  4  5  6  7
 5  6  7  8  9 10 11   4  5  6  7  8  9 10   8  9 10 11 12 13 14
12 13 14 15 16 17 18  11 12 13 14 15 16 17  15 16 17 18 19 20 21
19 20 21 22 23 24 25  18 19 20 21 22 23 24  22 23 24 25 26 27 28
26 27 28 29           25 26 27 28 29 30 31  29 30

问7、如何显示orthodox Easter 的信息

答:使用 ncal 命令添加 -o 参数

$ ncal -o
 5 May 2013

问8、如何显示国家代码

答:使用 ncal 命令添加 -p 参数

$ ncal -p
 AL Albania        1912-11-30      IT Italy          1582-10-04
 AT Austria        1583-10-05      JP Japan          1918-12-18
 AU Australia      1752-09-02      LI Lithuania      1918-02-01
 BE Belgium        1582-12-14      LN Latin          9999-05-31
 BG Bulgaria       1916-03-18      LU Luxembourg     1582-12-14
 CA Canada         1752-09-02      LV Latvia         1918-02-01
 CH Switzerland    1655-02-28      NL Netherlands    1582-12-14
 CN China          1911-12-18      NO Norway         1700-02-18
 CZ Czech Republic 1584-01-06      PL Poland         1582-10-04
 DE Germany        1700-02-18      PT Portugal       1582-10-04
 DK Denmark        1700-02-18      RO Romania        1919-03-31
 ES Spain          1582-10-04      RU Russia         1918-01-31
 FI Finland        1753-02-17      SI Slovenia       1919-03-04
 FR France         1582-12-09      SW Sweden         1753-02-17
 GB United Kingdom 1752-09-02      TR Turkey         1926-12-18
 GR Greece         1924-03-09     *US United States  1752-09-02
 HU Hungary        1587-10-21      YU Yugoslavia     1919-03-04
 IS Iceland        1700-11-16

问9、如何按自然月显示周信息

答:使用 ncal 命令添加 -w 参数

$ ncal -w
    July 2013
Su     7 14 21 28
Mo  1  8 15 22 29
Tu  2  9 16 23 30
We  3 10 17 24 31
Th  4 11 18 25
Fr  5 12 19 26
Sa  6 13 20 27
   26 27 28 29 30

  最下面的一行是下个月的信息。

问10、怎么一下查看全年的日历

答:使用 ncal 命令添加 -y 参数和 四位数的年份

$ ncal -y 2010
                                  2010
    January           February          March             April
Su     3 10 17 24 31     7 14 21 28        7 14 21 28        4 11 18 25
Mo     4 11 18 25     1  8 15 22        1  8 15 22 29        5 12 19 26
Tu     5 12 19 26     2  9 16 23        2  9 16 23 30        6 13 20 27
We     6 13 20 27     3 10 17 24        3 10 17 24 31        7 14 21 28
Th     7 14 21 28     4 11 18 25        4 11 18 25        1  8 15 22 29
Fr  1  8 15 22 29     5 12 19 26        5 12 19 26        2  9 16 23 30
Sa  2  9 16 23 30     6 13 20 27        6 13 20 27        3 10 17 24

    May               June              July              August
Su     2  9 16 23 30     6 13 20 27        4 11 18 25     1  8 15 22 29
Mo     3 10 17 24 31     7 14 21 28        5 12 19 26     2  9 16 23 30
Tu     4 11 18 25     1  8 15 22 29        6 13 20 27     3 10 17 24 31
We     5 12 19 26     2  9 16 23 30        7 14 21 28     4 11 18 25
Th     6 13 20 27     3 10 17 24        1  8 15 22 29     5 12 19 26
Fr     7 14 21 28     4 11 18 25        2  9 16 23 30     6 13 20 27
Sa  1  8 15 22 29     5 12 19 26        3 10 17 24 31     7 14 21 28

    September         October           November          December
Su     5 12 19 26        3 10 17 24 31     7 14 21 28        5 12 19 26
Mo     6 13 20 27        4 11 18 25     1  8 15 22 29        6 13 20 27
Tu     7 14 21 28        5 12 19 26     2  9 16 23 30        7 14 21 28
We  1  8 15 22 29        6 13 20 27     3 10 17 24        1  8 15 22 29
Th  2  9 16 23 30        7 14 21 28     4 11 18 25        2  9 16 23 30
Fr  3 10 17 24        1  8 15 22 29     5 12 19 26        3 10 17 24 31
Sa  4 11 18 25        2  9 16 23 30     6 13 20 27        4 11 18 25

问11、如何显示某个月和某个月前几个月和后几个月的日历

答:使用 cal 命令添加 -m -B -A 参数和月个数

$ cal -m4 -B2 -A2
   February 2013           March 2013            April 2013
Su Mo Tu We Th Fr Sa  Su Mo Tu We Th Fr Sa  Su Mo Tu We Th Fr Sa
                1  2                  1  2      1  2  3  4  5  6
 3  4  5  6  7  8  9   3  4  5  6  7  8  9   7  8  9 10 11 12 13
10 11 12 13 14 15 16  10 11 12 13 14 15 16  14 15 16 17 18 19 20
17 18 19 20 21 22 23  17 18 19 20 21 22 23  21 22 23 24 25 26 27
24 25 26 27 28        24 25 26 27 28 29 30  28 29 30
                      31

      May 2013             June 2013
Su Mo Tu We Th Fr Sa  Su Mo Tu We Th Fr Sa
          1  2  3  4                     1
 5  6  7  8  9 10 11   2  3  4  5  6  7  8
12 13 14 15 16 17 18   9 10 11 12 13 14 15
19 20 21 22 23 24 25  16 17 18 19 20 21 22
26 27 28 29 30 31     23 24 25 26 27 28 29
                      30

  显示结果上,您可以看出,我们想显示 4 月份和 4 月份前两个月和后两个月的日历。如果您想显示指定年份的日历同时在显示年份前后的几个月,那么直需要在添加 -y 参数和四位数的年份即可:

$ cal -y 2012 -B2 -A2
   November 2011         December 2011          January 2012
Su Mo Tu We Th Fr Sa  Su Mo Tu We Th Fr Sa  Su Mo Tu We Th Fr Sa
       1  2  3  4  5               1  2  3   1  2  3  4  5  6  7
 6  7  8  9 10 11 12   4  5  6  7  8  9 10   8  9 10 11 12 13 14
13 14 15 16 17 18 19  11 12 13 14 15 16 17  15 16 17 18 19 20 21
20 21 22 23 24 25 26  18 19 20 21 22 23 24  22 23 24 25 26 27 28
27 28 29 30           25 26 27 28 29 30 31  29 30 31

   February 2012           March 2012            April 2012
Su Mo Tu We Th Fr Sa  Su Mo Tu We Th Fr Sa  Su Mo Tu We Th Fr Sa
          1  2  3  4               1  2  3   1  2  3  4  5  6  7
 5  6  7  8  9 10 11   4  5  6  7  8  9 10   8  9 10 11 12 13 14
12 13 14 15 16 17 18  11 12 13 14 15 16 17  15 16 17 18 19 20 21
19 20 21 22 23 24 25  18 19 20 21 22 23 24  22 23 24 25 26 27 28
26 27 28 29           25 26 27 28 29 30 31  29 30

      May 2012             June 2012             July 2012
Su Mo Tu We Th Fr Sa  Su Mo Tu We Th Fr Sa  Su Mo Tu We Th Fr Sa
       1  2  3  4  5                  1  2   1  2  3  4  5  6  7
 6  7  8  9 10 11 12   3  4  5  6  7  8  9   8  9 10 11 12 13 14
13 14 15 16 17 18 19  10 11 12 13 14 15 16  15 16 17 18 19 20 21
20 21 22 23 24 25 26  17 18 19 20 21 22 23  22 23 24 25 26 27 28
27 28 29 30 31        24 25 26 27 28 29 30  29 30 31

    August 2012          September 2012         October 2012
Su Mo Tu We Th Fr Sa  Su Mo Tu We Th Fr Sa  Su Mo Tu We Th Fr Sa
          1  2  3  4                     1      1  2  3  4  5  6
 5  6  7  8  9 10 11   2  3  4  5  6  7  8   7  8  9 10 11 12 13
12 13 14 15 16 17 18   9 10 11 12 13 14 15  14 15 16 17 18 19 20
19 20 21 22 23 24 25  16 17 18 19 20 21 22  21 22 23 24 25 26 27
26 27 28 29 30 31     23 24 25 26 27 28 29  28 29 30 31
                      30

   November 2012         December 2012          January 2013
Su Mo Tu We Th Fr Sa  Su Mo Tu We Th Fr Sa  Su Mo Tu We Th Fr Sa
             1  2  3                     1         1  2  3  4  5
 4  5  6  7  8  9 10   2  3  4  5  6  7  8   6  7  8  9 10 11 12
11 12 13 14 15 16 17   9 10 11 12 13 14 15  13 14 15 16 17 18 19
18 19 20 21 22 23 24  16 17 18 19 20 21 22  20 21 22 23 24 25 26
25 26 27 28 29 30     23 24 25 26 27 28 29  27 28 29 30 31
                      30 31

   February 2013
Su Mo Tu We Th Fr Sa
                1  2
 3  4  5  6  7  8  9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28

  从结果上我们看到,除了 2012 年整年外,我们还能看到 2011 年最后俩月和 2013 年前俩月的日历。

问12、如何让 ncal 命令显示成  cal 命令的结果

答:可以使用 -C 参数来完成这一点

$ ncal
    July 2013
Su     7 14 21 28
Mo  1  8 15 22 29
Tu  2  9 16 23 30
We  3 10 17 24 31
Th  4 11 18 25
Fr  5 12 19 26
Sa  6 13 20 27

$ cal
     July 2013
Su Mo Tu We Th Fr Sa
    1  2  3  4  5  6
 7  8  9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31

$ ncal -C
     July 2013
Su Mo Tu We Th Fr Sa
    1  2  3  4  5  6
 7  8  9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31

  同样,你可以使用 -N 参数来让 cal 命令看起来和 ncal 一样:

$ cal
     July 2013
Su Mo Tu We Th Fr Sa
    1  2  3  4  5  6
 7  8  9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31

$ ncal
    July 2013
Su     7 14 21 28
Mo  1  8 15 22 29
Tu  2  9 16 23 30
We  3 10 17 24 31
Th  4 11 18 25
Fr  5 12 19 26
Sa  6 13 20 27

$ cal -N
    July 2013
Su     7 14 21 28
Mo  1  8 15 22 29
Tu  2  9 16 23 30
We  3 10 17 24 31
Th  4 11 18 25
Fr  5 12 19 26
Sa  6 13 20 27

问13、如何让日历显示成以周一为每周第一天的样子

答:使用 ncal 命令添加 -M 参数即可

$ ncal -M
    July 2013
Mo  1  8 15 22 29
Tu  2  9 16 23 30
We  3 10 17 24 31
Th  4 11 18 25
Fr  5 12 19 26
Sa  6 13 20 27
Su  7 14 21 28

  还有一个 -S 参数,可以按周日为第一天来显示

问14、如何切换 ncal 命令为以前的显示方式

答:使用 ncal 命令添加 -b 参数

$ ncal
    July 2013
Su     7 14 21 28
Mo  1  8 15 22 29
Tu  2  9 16 23 30
We  3 10 17 24 31
Th  4 11 18 25
Fr  5 12 19 26
Sa  6 13 20 27

$ ncal -b
     July 2013
Su Mo Tu We Th Fr Sa
    1  2  3  4  5  6
 7  8  9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31

cal 和 ncal 命令的一些其他相关信息

  虽然我们可以查看这两个的命令的 man page 来得到更多的信息,不过在这里,我还有一些其他信息要告诉大家。需要指定年份的时候,我们需要四位数的年份。不是所有的参数都可以同时使用的,比如 -y, -3, -1 他们之间是冲突的,如果同时使用,后面的参数会覆盖掉前面的参数。

 已同步至 linux的微博

来源:https://linux.cn/article-1667-1.html

Linux:使用“~.”退出无响应的 SSH 连接

大家有时候会发现 ssh 挂在那里没有响应了,可能是客户端的问题,也可能是服务器端的问题,也可能是客户端和服务器之间的网络问题;可能是客户端电脑休眠后连接断了、可能是网络断了、可能是 WiFi 信号不好、可能是网络延迟大了、可能是服务器挂了、也可能是服务器上的 sshd 进程挂了,…,可能是技术问题,也可能是非技术问题,可以找出无数可能。

我常遇到或者说每天都遇到的情形是,离开办公桌前忘了退出 ssh 会话。工作的时候长时间 ssh 到服务器上,工作完盖上 Mac 走人,回家后发现那些没退出的 ssh 会话还挂在那里,无法退出、无法 Ctrl+C、无法做任何操作。

我的粗暴做法通常是直接关闭 Terminal 后重新开一个新的;如果用的不是图形系统,没有窗口可以关闭,那还要启用另一个终端找到相关进程后 kill 掉,如果每天都要搞这么几次还是挺烦人的。

今天无意中从同事那里学到了一个小技巧,在那些没退出的 ssh 会话里用 ~. “优雅” 的断开连接。

~.

查看一下 man 帮助文件发现已经有说明,惭愧的是用了这么多年 ssh 才发现有这么一招:

$ man ssh
...
ESCAPE CHARACTERS
     ...

     The supported escapes (assuming the default `~') are:

     ~.      Disconnect.

via http://www.vpsee.com/2013/08/how-to-kill-an-unresponsive-ssh-connection/ 

Linux:优化GNU/Linux桌面安装的九个步骤

  配置GNU/Linux的工作不是说安装光盘弹出来后,甚至不是说安装后向导运行后就算完成了。虽说安装后你面对的是个基本系统,却不是你的所有偏好和需求都已经考虑在内的优化后系统。考虑到操作系统的大小和复杂性,别指望系统安装后就让你称心如意–在Windows上完成安装后基本上也是这种情形。

  要是你对GNU/Linux有所了解,也许知道你不需要碎片整理工具,也不需要为反病毒软件过于操心。但是你还需要做其他的什么事情呢?就这个问题而言,大多数发行版基本上保持沉默,不过安装自己的操作系统的用户数量只是所有计算机用户中的一小部分。现在,你甚至无法想当然地认为所有GNU/Linux用户都安装了自己的操作系统。

  为了弥补这个不足,你在安装GNU/Linux后应该考虑下列九个步骤。我花了好多个晚上调整自己家里的众多桌面计算机后才写成了这篇指南文章。逐一遵照这些步骤是要花些时间,但如果你果真这么做,就有助于确保你在使用新安装的操作系统时更轻松自如。

一、更新你的系统

  新版本的自由软件程序在不断发布出来。由于这个原因,来自你已安装系统的CD或DVD映像文件已经过时的可能性相当大。正因为如此,你在安装后的第一步应该是升级系统。除了你自然希望拥有最新的工具不说,你还会得到最新的安全补丁。你会在基本上毋需解释的桌面面板上的通知托盘中找到更新图标。

二、启用安全功能

  就因为GNU/Linux不受病毒困扰、采用了安全设计,并不是说你就可以随便冒险了。一旦你更新了系统,应该采取的下一步是,确保你系统的安全工具在为你发挥作用。

  在Debian、Fedora、Gentoo、Mandrake、红帽和SuSE等发行版上,你能够采取的最重要的一个步骤就是,安装和运行Bastille.bastille是一个系统加固工具,同时可以教你一些安全常识,建议采取确保系统安全的标准方法,并提议为什么可能需要各个选项.bastille的开发者Jay Beale建议,该工具的选项也许是你所需要的安全机制。

  不过,要是你的发行版有SELinux或AppArmor,你可能还要考虑使用它们来加强安全。这么做的话,系统性能可能会下降几个百分点,但是性能受影响的程度小于在后台运行病毒扫描工具。

  尤其是SELinux以配置困难而出名,但在Fedora等一些发行版中,它又是安装的一个标准部分,图形化工具可以处理它的一些基本操作。

  你在考虑安全时,如果你与Windows用户交换文件,或者与同一台计算机上安装的Windows系统(下文有介绍)交换文件,可能还应该安装Clam反病毒工具。你的GNU/Linux发行版不需要它,但安装的Windows系统可能需要它。

三、安装打印机

  如今,GNU/Linux安装程序、尤其是面向新用户的那些安装程序,通常能检测到你的大部分硬件,包括互联网连接。但由于某个原因,大多数安装程序(包括Windows的安装程序)忽略了打印机配置,尽管普通计算机已连接至打印机。

  幸好,如今打印机配置起来很容易。你需要的工具是GNOME菜单中的System(系统)> Administration(管理)> Printing(打印),以及KDE 4菜单中的Administration(管理)> Printing(打印)。你可能想要以根用户的身份安装,那样每个人可以使用该打印机,不过你在KDE中的确有这个选项:只为当前帐户启用打印机。无论借助上述哪种工具,你都需要插上计算机,然后按指示操作。

  如果你的打印机没有列出来,可以到Linux打印机数据库里面找找。可能会找到关于让你那台打印机正常工作的其他驱动程序的信息。如果是PostScript打印机,你在按指示操作时,只需要选择通用PostScript驱动程序。

四、选择和配置电子软件阅读器

  就跟在Windows上一样,在GNU/Linux上,你也需要在安装后配置电子邮件阅读器,输入用于收发邮件的信息,比如地址、密码和服务器。你可以从现有的操作系统获得这些信息;必要的话,也可以从你的互联网服务提供商(ISP)获得这些信息。

  自由软件至少包括十几种邮件阅读器,但最常见的是GNOME的Evolution、KDE的KMail和Thunderbird(火狐Web浏览器的配套应用程序)。对习惯使用Outlook的那些用户而言,Evolution似乎最熟悉,它有内置的联系人列表和备忘录,但是上述这三款应用程序在功能特性上都大体相似.thunderbird尤其大受欢迎,因为它在Windows上也可以使用。

  不管你选择了哪款邮件阅读器,启用电子邮件都很直观简单,只要你有必要的信息.evolution和Thunderbird都含有可以指导你的向导,但是如果你有条不紊地操作,KMail安装起来几乎一样容易。

  一旦你安装了邮件阅读器,可能还要花点时间来配置其邮件过滤器,以便将邮件发送到不同的文件夹,并识别垃圾邮件。

五、决定要不要使用专有的驱动程序、编解码器和阅读器

  GNU/Linux桌面在不断改进。不过,为了恪守自由软件理念,许多发行版选择了不随带专有软件,哪怕专有软件明明可以增强功能。

  你应该趁早决定要不要尝试使用专有组件。可能最常用的专有软件是ATI或英伟达显卡的视频驱动程序。如果是办公套件,你不需要操心;但是如果你是游戏玩家、动画师或CAD用户,或者想试一试复合窗口管理器–简而言之,如果你预计处理的任务需要三维加速,那么你可能需要探究专有的视频驱动程序。

  你可能需要的其他专有组件是用于音频和视频格式的MP3和Win32编解码器。相比之下,你用免费的PDF阅读器也许能应付过去。而就许多用途而言,Gnash正开始成为一款尚可接受的Adobe Flash阅读器,而免费版本的Java足以取代Sun Java。

  其中一些专有软件也许就在你发行版的软件库中。在其他情况下,你可能需要访问某个特定的下载网站或非官方软件库,这取决于专有软件或发行版。在你发行版的邮件列表中找一番,也许能找到需要的来源,但是切记:非官方软件库有时会引起兼容问题,需要花好长时间去分析,才能查明问题根源、解决问题。这些问题就好比是你为自由软件理想而付出的代价。

六、选择如何在GNU/Linux与Windows之间共享

  许多GNU/Linux安装在双引导系统上,你开启计算机后,引导管理器就会打开,你可以从中选择引导Windows还是引导GNU/Linux。如果你经常需要在这两种操作系统之间来回切换,恐怕需要决定如何共享文件。

  你应该可以轻而易举地从GNU/Linux读取Windows上的文件。实际上,许多发行版在安装过程中已经准备好了这项功能。就算没有,可以在/mnt目录(这是访问分区的传统地方)下创建子文件夹,并使用mount命令来访问你的Windows分区。唯一复杂的部分是分区名称,而如今,分区名称可能是/dev/sda1,所以典型的命令会是:mount /dev/sda1 /mnt/share。为了让自己没必要使用该命令,你可以编辑/etc/fstab文件–该文件列出了每当机器启动就能访问的那些分区,从而自动访问Windows分区.man fstab这个命令应该会提供你需要的所有帮助,但是需要的话,可以在网上找到更多的帮助。

  如果从Windows读取GNU/Linux上的文件,问题来得较为复杂,原因是Windows无法像GNU/Linux那样可以阅读众多分区格式。如果是偶尔共享一下,用闪驱或者以电子邮件附件方式发给自己应该足以满足需求。不过,如果经常共享,这些方法用起来就不方便。最简单的解决办法就是,使用GParted Live CD(http://gparted.sourceforge.net/livecd.php)–这是相当于Partition Magic的自由软件,创建一个FAT32分区,将你在两个系统中需要的所有文件都存储在该分区上面。由于两种操作系统都能读取这种分区格式,这是最有效的解决办法,如果你为fstab添加了新分区,更是如此。

七、配置你的Web浏览器

  虽然GNU/Linux让用户可以选择几款浏览器,但是火狐及其他基于Mozilla的浏览器(比如Epiphany)仍然最受欢迎。如今,这类浏览器要是没有你偏爱的扩展件就称不上功能齐全–就本人而言,要是没有五六个用于处理标签、保存会话以便即时恢复的扩展件,我会显得很迷茫。

  如果你早已在Windows上使用火狐,就要让装有该操作系统的驱动器能够被GNU/Linux访问(见上文),还要设法将你的书签及其他设置一并迁移过去。我在过去做这件事情时遇到了好坏参半的结果,但总归是值得一试。

八、定制你的桌面

  GNU/Linux桌面具有高度可配置性。虽然你可能不想马上考虑一整套的定制选项,但是可能需要设置桌面背景和字体大小以及类似选项。在GNOME中,你可以在菜单中的System(系统)> Preferences(参数)下面找到基本选项。在KDE 4中,先后找到Settings(设置)> System Settings(系统设置)> Look and Feel and Personal(外观、感觉及个性化)。

九、考虑使用其他应用程序

  发行版包含能想到的一切组件这种时代早过去了。自由软件的魅力仍然在于选择,所以当你完成了基本的安装后工作后,不妨再来点轻松的工作:通过桌面的软件安装工具(通常在主菜单中被标为添加/删除软件之类的选项),看看有什么替代应用程序可用来处理你的其他日常要求。

  用OpenOffice.org还是KOffice?用XChat还是Pidgin?用AmoroK还是Exaile?用KDE、GNOME还是Xfce?由于它们都是免费的、比较小巧,你可以安装所有替代应用程序,用不了多久;而且可以同样快速地删除不需要的应用程序。

备份配置结果

  就算你知道自己在干嘛,所有这些安装后的配置工作也要花时间。为了不必重新配置,一旦你完成了配置,就要备份系统。起码应该备份/home和/etc这两个目录里面的一切内容,因为这些是存放大多数配置和定制参数的地方。软件程序本身不太重要,因为你没必要注册软件,重新安装软件基本上是个开始安装后不用去管它的过程。

  万一你果真需要另一次安装,就可以拷贝/home目录和来自/etc的重要文件,并迅速恢复你的许多定制参数。不过,由于你可能以根用户的身份在备份和恢复文件,切记使用chown和chgrp这两个命令,将已恢复文件的所有权赋予给拥有相应目录的用户。比如说,你应该使用chown -R bsmith /home/bsmith/,为bsmith用户帐户更改文件所有权。

其他步骤

  你所选择的发行版、可用硬件以及你自己的工作要求,这些都将确定你是否需要采取其他步骤来完成GNU/Linux系统的安装。总的趋势是,安装程序在为你接过更重的担子,但一些不是面向新用户的发行版仍要求你处理更多的工作。在一些情况下,你的硬件(尤其是无线网卡、调制解调器和网络摄像头)也可能需要像Ndiswrapper这样的模块,之后系统才可以完全正常使用。同样,图形设计人员可能想使用KDE的Font Installer来添加字体,而处理几种语言的人可能想安装几种不同的地方语言和键盘布局。

  所有这些情况都需要付出额外的工作量。不过好消息是,GNU/Linux的用途极其广泛,足以满足一系列广泛的要求,这是大多数操作系统所无法比拟的。无论你有什么样的需求,GNU/Linux都应该能满足,只要你肯花时间来尝试和配置。按你偏爱的方式配置起来的安全系统就是对你的最大回报。

原文链接:http://www.datamation.com/osrc/article.php/3747066/Nine-Steps-to-Optimal-GNULinux-Desktop-Setup.htm

译文:http://os.51cto.com/art/201308/407373.htm