Ansh 发布的文章

Meld 是 Linux 上功能丰富的可视化比较和合并工具。如果你是第一次接触,你可以进入我们的初学者指南,了解该程序的工作原理,如果你已经阅读过或正在使用 Meld 进行基本的比较/合并任务,你将很高兴了解本教程的东西,在本教程中,我们将讨论一些非常有用的技巧,这将让你使用工具的体验更好。

但在我们跳到安装和解释部分之前,值得一提的是,本教程中介绍的所有说明和示例已在 Ubuntu 14.04 上进行了测试,而我们使用的 Meld 版本为 3.14.2

1、 跳转

你可能已经知道(我们也在初学者指南中也提到过这一点),标准滚动不是在使用 Meld 时在更改之间跳转的唯一方法 - 你可以使用向上和向下箭头键轻松地从一个更改跳转到另一个更改位于编辑区域上方的窗格中:

Navigating in Meld

但是,这需要你将鼠标指针移动到这些箭头,然后再次单击其中一个(取决于你要去哪里 - 向上或向下)。你会很高兴知道,存在另一种更简单的方式来跳转:只需使用鼠标的滚轮即可在鼠标指针位于中央更改栏上时进行滚动。

The change bar

这样,你就可以在视线不离开或者分心的情况下进行跳转,

2、 可以对更改进行的操作

看下上一节的最后一个屏幕截图。你知道那些黑箭头做什么吧?默认情况下,它们允许你执行合并/更改操作 - 当没有冲突时进行合并,并在同一行发生冲突时进行更改。

但是你知道你可以根据需要删除个别的更改么?是的,这是可能的。为此,你需要做的是在处理更改时按下 Shift 键。你会观察到箭头被变成了十字架。

Things you can do with changes

只需点击其中任何一个,相应的更改将被删除。

不仅是删除,你还可以确保冲突的更改不会在合并时更改行。例如,以下是一个冲突变化的例子:

Delete changes in Meld

现在,如果你点击任意两个黑色箭头,箭头指向的行将被改变,并且将变得与其他文件的相应行相似。只要你想这样做,这是没问题的。但是,如果你不想要更改任何行呢?相反,目的是将更改的行在相应行的上方或下方插入到其他文件中。

我想说的是,例如,在上面的截图中,需要在 “test23” 之上或之下添加 “test 2”,而不是将 “test23” 更改为 “test2”。你会很高兴知道在 Meld 中这是可能的。就像你按下 Shift 键删除注释一样,在这种情况下,你必须按下 Ctrl 键。

你会观察到当前操作将被更改为插入 - 双箭头图标将确认这一点 。

Change actions

从箭头的方向看,此操作可帮助用户将当前更改插入到其他文件中的相应更改 (如所选择的)。

3、 自定义文件在 Meld 的编辑器区域中显示的方式

有时候,你希望 Meld 的编辑区域中的文字大小变大(为了更好或更舒适的浏览),或者你希望文本行被包含而不是脱离视觉区域(意味着你不要想使用底部的水平滚动条)。

Meld 在 Editor 选项卡(Edit->Preferences->Editor)的 Preferences 菜单中提供了一些显示和字体相关的自定义选项,你可以进行这些调整:

Meld preferences

在这里你可以看到,默认情况下,Meld 使用系统定义的字体宽度。只需取消选中 Font 类别下的框,你将有大量的字体类型和大小选项可供选择。

然后在 Display 部分,你将看到我们正在讨论的所有自定义选项:你可以设置 Tab 宽度、告诉工具是否插入空格而不是 tab、启用/禁用文本换行、使Meld显示行号和空白(在某些情况下非常有用)以及使用语法突出显示。

4、 过滤文本

有时候,并不是所有的修改都是对你很重要的。例如,在比较两个 C 编程文件时,你可能不希望 Meld 显示注释中的更改,因为你只想专注于与代码相关的更改。因此,在这种情况下,你可以告诉 Meld 过滤(或忽略)与注释相关的更改。

例如,这里是 Meld 中的一个比较,其中由工具高亮了注释相关更改:

Filter Text in Meld

而在这种情况下,Meld 忽略了相同的变化,仅关注与代码相关的变更:

Ignore Changes in Meld

很酷,不是吗?那么这是怎么回事?为此,我是在 “Edit->Preferences->Text Filters” 标签中启用了 “C comments” 文本过滤器:

C-Comments in Meld

如你所见,除了 “C comments” 之外,你还可以过滤掉 C++ 注释、脚本注释、引导或所有的空格等。此外,你还可以为你处理的任何特定情况定义自定义文本过滤器。例如,如果你正在处理日志文件,并且不希望 Meld 高亮显示特定模式开头的行中的更改,则可以为该情况定义自定义文本过滤器。

但是,请记住,要定义一个新的文本过滤器,你需要了解 Python 语言以及如何使用该语言创建正则表达式。

总结

这里讨论的所有四个技巧都不是很难理解和使用(当然,除了你想立即创建自定义文本过滤器),一旦你开始使用它们,你会认为他们是真的有好处。这里的关键是要继续练习,否则你学到的任何技巧不久后都会忘记。

你还知道或者使用其他任何中级 Meld 的贴士和技巧么?如果有的话,欢迎你在下面的评论中分享。


via: https://www.howtoforge.com/tutorial/beginners-guide-to-visual-merge-tool-meld-on-linux-part-2/

作者:Ansh 译者:geekpi 校对:wxy

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

虽然插件毫无疑问是 Vim 最大的优势,然而,还有其它一些功能,使得它成为当今 Linux 用户中最强大、功能最丰富的文本编辑器/IDE 之一。其中一个功能就是可以根据文件做特定的设置。我们可以使用该编辑器的 模式行 Modeline 特性来实现该功能。

在这篇文章中,我将讨论如何使用 Vim 的 模式行 Modeline 特性来简单的理解一些例子。

在开始之前,值得提醒一下,这篇教程中提及的所有例子、命令和指令都已经在 Ubuntu 16.04 中使用 Vim 7.4 版本测试过。

VIM 模式行

用法

正如上面已经提到的, Vim 的模式行特性让你能够进行特定于文件的更改。比如,假设你想把项目中的一个特定文件中的所有制表符用空格替换,并且确保这个更改不会影响到其它所有文件。这是模式行帮助你完成你想做的事情的一个理想情况。

因此,你可以考虑将下面这一行加入文件的开头或结尾来完成这件事。

# vim: set expandtab:

(LCTT 译注:模式行就是一行以注释符,如 #///* 开头,间隔一个空格,以 vim: 关键字触发的设置命令。可参看:http://vim.wikia.com/wiki/Modeline_magic

如果你是在 Linux 系统上尝试上面的练习来测试用例,很有可能它将不会像你所期望的那样工作。如果是这样,也不必担心,因为某些情况下,模式行特性需要先激活才能起作用(出于安全原因,在一些系统比如 Debian、Ubuntu、GGentoo 和 OSX 上默认情况下禁用)。

为了启用该特性,打开 .vimrc 文件(位于 home 目录),然后加入下面一行内容:

set modeline

现在,无论何时你在该文件输入一个制表符然后保存时(文件中已输入 expandtab 模式行命令的前提下),都会被自动转换为空格。

让我们考虑另一个用例。假设在 Vim 中, 制表符默认设置为 4 个空格,但对于某个特殊的文件,你想把它增加到 8 个。对于这种情况,你需要在文件的开头或末尾加上下面这行内容:

// vim: noai:ts=8:

现在,输入一个制表符,你会看到,空格的数量为 8 个。

你可能已经注意到我刚才说的,这些模式行命令需要加在靠近文件的顶部或底部。如果你好奇为什么是这样,那么理由是该特性以这种方式设计的。下面这一行(来自 Vim 官方文件)将会解释清楚:

“模式行不能随意放在文件中的任何位置:它需要放在文件中的前几行或最后几行。modelines 变量控制 Vim 检查模式行在文件中的确切位置。请查看 :help modelines 。默认情况下,设置为 5 行。”

下面是 :help modelines 命令(上面提到的)输出的内容:

如果 modeline 已启用并且 modelines 给出了行数,那么便在相应位置查找 set 命令。如果 modeline 禁用或 modelines 设置的行数为 0 则不查找。

尝试把模式行命令置于超出 5 行的范围(距离文件底部和顶部的距离均超过 5 行),你会发现, 制表符将会恢复为 Vim 默认数目的空格 — 在我的情况里是 4 个空格。

然而,你可以按照自己的意愿改变默认行数,只需在你的 .vimrc 文件中加入下面一行命令

set modelines=[新值]

比如,我把值从 5 增加到了 10 。

set modelines=10

这意味着,现在我可以把模式行命令置于文件前 10 行或最后 10 行的任意位置。

继续,无论何时,当你在编辑一个文件的时候,你可以输入下面的命令(在 Vim 编辑器的命令模式下输入)来查看当前与命令行相关的设置以及它们最新的设置。

:verbose set modeline? modelines?

比如,在我的例子中,上面的命令产生了如下所示的输出:

 modeline
      Last set from ~/.vimrc
 modelines=10
      Last set from ~/.vimrc

关于 Vim 的模式行特性,你还需要知道一些重要的点:

  • 默认情况下,当 Vim 以非兼容(nocompatible)模式运行时该特性是启用的,但需要注意的是,在一些发行版中,出于安全考虑,系统的 vimrc 文件禁用了该选项。
  • 默认情况下,当以 root 权限编辑文件时,该特性被禁用(如果你是使用 sudo 方式打开该文件,那么该特性依旧能够正常工作)。
  • 通过 set 来设置模式行,其结束于第一个冒号,而非反斜杠。不使用 set,则后面的文本都是选项。比如,/* vim: noai:ts=4:sw=4 */ 是一个无效的模式行。

(LCTT 译注:关于模式行中的 set,上述描述指的是:如果用 set 来设置,那么当发现第一个 : 时,表明选项结束,后面的 */ 之类的为了闭合注释而出现的文本均无关;而如果不用 set 来设置,那么以 vim: 起头的该行所有内容均视作选项。 )

安全考虑

令人沮丧的是, Vim 的模式行特性可能会造成安全性问题。事实上,在过去,已经报道过多个和模式行相关的问题,包括 shell 命令注入任意命令执行无授权访问等。我知道,这些问题发生在很早的一些时候,现在应该已经修复好了,但是,这提醒了我们,模式行特性有可能会被黑客滥用。

结论

模式行可能是 Vim 编辑器的一个高级命令,但是它并不难理解。毫无疑问,它的学习曲线会有一些复杂,但是不需多问也知道,该特性是多么的有用。当然,出于安全考虑,在启用并使用该选项前,你需要对自己的选择进行权衡。

你有使用过模式行特性吗?你的体验是什么样的?记得在下面的评论中分享给我们。


via: https://www.howtoforge.com/tutorial/vim-modeline-settings/

作者:Ansh 译者:ucasFL 校对:wxy

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

我们已经从一个新手的角度了解了 Meld (包括 Meld 的安装),我们也提及了一些 Meld 中级用户常用的小技巧。如果你有印象,在新手教程中,我们说过 Meld 可以比较文件和文件夹。已经讨论过怎么比较文件,今天,我们来看看 Meld 怎么比较文件夹。

需要指出的是,本教程中的所有命令和例子都是在 Ubuntu 14.04 上测试的,使用的 Meld 版本为 3.14.2。

用 Meld 比较文件夹

打开 Meld 工具,然后选择 比较文件夹 Directory comparison 选项来比较两个文件夹。

Compare directories using Meld

选择你要比较的文件夹:

select the directories

然后单击 比较 Compare 按钮,你会看到 Meld 像图中这样分成两栏比较目录,就像文件比较一样。

Compare directories visually

分栏会树形显示这些文件夹。你可以在上图中看到 —— 区别之处,不论是新建的还是被修改过的文件 —— 都会以不同的颜色高亮显示。

根据 Meld 的官方文档可以知道,在窗口中看到的每个不同的文件或文件夹都会被突出显示。这样就很容易看出这个文件/文件夹与另一个分栏中对应位置的文件/文件夹的区别。

下表是 Meld 网站上列出的在比较文件夹时突出显示的不同字体大小/颜色/背景等代表的含义。

状态表现含义
相同正常字体比较的文件夹中所有文件/文件夹相同。
过滤后相同斜体文件夹中文件不同,但使用文本过滤器的话,文件是相同的。
修改过蓝色粗体比较的文件夹中这些文件不同。
新建绿色粗体该文件/文件夹在这个目录中存在,但其它目录中没有。
缺失置灰文本,删除线该文件/文件夹在这个目录中不存在,在在其它某个目录中存在。
错误黄色背景的红色粗体比较文件时发生错误,最常见错误原因是文件权限(例如,Meld 无法打开该文件)和文件名编码错误。

Meld 默认会列出比较文件夹中的所有内容,即使这些内容没有任何不同。当然,你也可以在工具栏中单击 相同 Same 按钮设置 Meld 不显示这些相同的文件/文件夹 —— 单击这个按钮使其不可用。

same button

Meld compare buttons

下面是单击 相同 Same 按钮使其不可用的截图:

Directory Comparison without same files

这样你会看到只显示了两个文件夹中不同的文件(新建的和修改过的)。同样,如果你单击 新建 New 按钮使其不可用,那么 Meld 就只会列出修改过的文件。所以,在比较文件夹时可以通过这些按钮自定义要显示的内容。

你可以使用工具窗口显示区的上下箭头来切换选择是显示新建的文件还是修改过的文件。要打开两个文件进行分栏比较,可以双击文件,或者单击箭头旁边的 比较 Compare 按钮。

meld compare arrow keys

提示 1:如果你仔细观察,就会看到 Meld 窗口的左边和右边有一些小条。这些条的目的是提供“简单的用颜色区分的比较结果”。对每个不同的文件/文件夹,条上就有一个小的颜色块。你可以单击每一个这样的小块跳到它对应的文件/文件夹。

提示 2:你总可以分栏比较文件,然后以你的方式合并不同的文件,假如你想要合并所有不同的文件/文件夹(就是说你想要一个特定的文件/文件夹与另一个完全相同),那么你可以用 复制到左边 Copy Left 复制到右边 Copy Right 按钮:

meld copy right part

比如,你可以在左边的分栏中选择一个文件或文件夹,然后单击 复制到右边 Copy Right 按钮,使右边对应条目完全一样。

现在,在窗口的下拉菜单中找到 过滤 Filters 按钮,它就在 相同 Same 新建 New 修改的 Modified 这三个按钮下面。这里你可以选择或取消文件的类型,告知 Meld 在比较文件夹时是否显示这种类型的文件/文件夹。官方文档解释说菜单中的这个条目表示“执行文件夹比较时该类文件名不会被查看。”

该列表中条目包括备份文件,操作系统元数据,版本控制文件、二进制文件和多媒体文件。

Meld filters

前面提到的条目也可以通过这样的方式找到:浏览->文件过滤。你可以通过 编辑->首选项->文件过滤 为这个条目增加新元素(也可以删除已经存在的元素)。

Meld preferences

要新建一个过滤条件,你需要使用一组 shell 符号,下表列出了 Meld 支持的 shell 符号:

通配符匹配
*任何字符 (例如,零个或多个字符)
?一个字符
[abc]所列字符中的任何一个
[!abc]不在所列字符中的任何一个
{cat,dog}“cat” 或 “dog” 中的一个

最重要的一点是 Meld 的文件名默认大小写敏感。也就是说,Meld 认为 readme 和 ReadMe 与 README 是不一样的文件。

幸运的是,你可以关掉 Meld 的大小写敏感。只需要打开 浏览 菜单然后选择 忽略文件名大小写 Ignore Filename Case 选项。 Meld ignore filename case

结论

你是否觉得使用 Meld 比较文件夹很容易呢 —— 事实上,我认为它相当容易。只有新建一个文件过滤器会花点时间,但是这不意味着你没必要学习创建过滤器。显然,这取决于你的需求。

另外,你甚至可以用 Meld 比较三个文件夹。想要比较三个文件夹时,你可以通过单击 三向比较 3-way comparison 复选框。今天,我们不介绍怎么比较三个文件夹,但它肯定会出现在后续的教程中。


via: https://www.howtoforge.com/tutorial/how-to-perform-directory-comparison-using-meld/

作者:Ansh 译者:vim-kakali 校对:jasminepeng

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

我们已经讲过 Linux 中一些基于命令行的比较和合并工具,再来讲解该系统的一些可视化的比较与合并工具也很合理。首要的原因是,不是每个人都习惯使用命令行,而且对于某些人来说,基于命令行的比较工具可能很难学习和理解。

因此,我们将会推出关于可视化工具 Meld 的系列文章。

在跳到安装和介绍部分前,我需要说明这篇教程里所有的指令和用例是都是可用的,而且它们已经在 Ubuntu 14.04 中测试过了,我们使用的 Meld 版本是 3.14.2。

关于 Meld

Meld 主要是一个可视化的比较和合并的工具,目标人群是开发者(当然,我们将要讲到的其它部分也会考虑到最终用户)。这个工具同时支持双向和三向的比较,不仅仅是比较文件,还可以比较目录,以及版本控制的项目。

“Meld 可以帮你回顾代码改动,理解补丁,”其官网如是说。“它甚至可以告知你如果你不进行合并将会发生什么事情。”该工具使用 GPL v2 协议进行授权。

安装 Meld

如果你用的是 Ubuntu 或者其它基于 Debian 的 Linux 分支,你可以用以下命令下载安装 Meld:

sudo apt-get install meld

或者你也可以用系统自带的包管理软件下载这个工具。比如在 Ubuntu 上,你可以用 Ubuntu 软件中心 Ubuntu Software Center ,或者用 Ubuntu 软件,它从 Ubuntu 16.04 版本开始取代了 Ubuntu 软件中心。

当然,Ubuntu 官方仓库里的 Meld 版本很有可能比较陈旧。因此如果你想要用更新的版本,你可以在这里下载软件包。如果你要用这个方法,你要做的就是解压下载好的软件包,然后运行 bin 目录下的 meld 程序。

~/Downloads/meld-3.14.2/bin$ ./meld 

以下是 Meld 依赖的软件,仅供参考:

  • Python 2.7 (Python 3.3 开发版)
  • GTK+ 3.14
  • GLib 2.36
  • PyGObject 3.14
  • GtkSourceView 3.14
  • pycairo

使用 Meld

装好了软件,就可以看到类似这样的画面:

Meld started

有三个选项: 比较文件 File comparison 比较目录 Directory comparison 以及 版本控制视图 Version control view

点击“比较文件”选项,就可以选择需要比较的文件:

Meld file comparison

就像上面的截图那样明白,Meld 也可以进行三向比较,但是在这一系列文章的第一部分,我们只会讲更常用的双向比较。

接着,选择你想要比较的文件,点击 “比较” Compare 按钮。软件会在两边分别打开两个文件,高亮不同的行(以及不同的部分)。

Compare files in Meld

两个文件的不同之处在第二行,差别在于 file2 文件的第二行多了一个 3。你看到的黑色箭头是用来进行合并或修改的操作的。该例中,向右的箭头将会把 file2 文件的第二行改成文件 file1 中对应行的内容。左向箭头做的事情相反。

做完修改后,按下 Ctrl+s 来保存。

这个简单的例子,让你知道 Meld 的基本用法。让我们看一看稍微复杂一点的比较:

Meld advanced file comparison

在讨论这些变化前,这里提一下, Meld 的界面中有几个区域,可以给出文件之间的差异,让概况变得直观。这里特别需要注意窗口的左右两边垂直的栏。比如下面这个截图:

Visual Comparison

仔细观察,图中的这个栏包含几个不同颜色的区块。这些区块是用来让你对文件之间的差异有个大概的了解。“每一个着色的区块表示一个部分,这个部分可能是插入、删除、修改或者有差别的,取决于区块所用的颜色。”官方文档是这样说的。

现在,让我们回到我们之前讨论的例子中。接下来的截图展示了用 Meld 理解文件的改动是很简单的(以及合并这些改动):

File changes visualized in Meld

Meld Example 2

Meld Example 3

接着,我们滑动文件,从一个改动跳到另一个。但是,当要比较的文件很大时,这会耗一点时间,当你想要滑动文件跳到一个改动的位置时,也会变得很困难。如果是这种情况的话,你可以用工具栏的橙色箭头,就在编辑区域的上方:

Go to next change in Meld

这些是你使用 Meld 时做的一般性的事情:可以用标准的 Ctrl+f 组合键在编辑区域内进行查找,按 F11 键让软件进入全屏模式,再按 Ctrl+r 来刷新(通常在所有要比较的文件改变的时候使用)。

以下是 Meld 官方网站宣传的重要特性:

  • 文件和目录的双向及三向比较
  • 输入即更新文件的比较
  • 自动合并模式,按块改动的动作让合并更加简单
  • 可视化让比较文件更简单
  • 支持 Git,Bazaar,Mercurial,Subversion 等等

注意还不仅仅只有以上所列的。网站上有个专门的特性页面,里面提到了 Meld 提供的所有特性。这个页面列出的所有特性分为几个部分,以该软件是用来做文件比较、目录比较、版本控制还是处于合并模式下为基础进行划分。

和其它软件相似,有些事情 Meld 做不到。官方网站上列出了其中的一部分:“当 Meld 展示文件之间的差异时,它同时显示两个文件,看起来就像在普通的文本编辑器中。它不会添加额外的行,让左右两边文件的特殊改动处于同样的行数。没有做这个事情的选项。”

总结

我们刚刚了解到的不过是皮毛,因为 Meld 还能做很多事情。考虑到这是教程系列的第一部分,这也挺不错的。这仅仅是让你了解 Meld 的作用,你可以配置它,忽略一些特定类型的改动,让它移动,复制或者删除文件之间的个别差异,也可以从命令行启动它。在即将退出的系列教程中,我们将会讲述所有这些重要功能。


via: https://www.howtoforge.com/tutorial/beginners-guide-to-visual-merge-tool-meld-on-linux/

作者:Ansh 译者:GitFuture 校对:wxy

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

到目前为止,在该系列指南中,我们已经讨论了 cd -pushd/popd 命令的基本使用方法和相关细节,以及 CDPATH 环境变量。在这第四期、也是最后一期文章中,我们会讨论别名的概念以及你可以如何使用它们使你的命令行导航更加轻松和平稳。

一如往常,在进入该指南的核心之前,值得指出本文中的所有命令以及展示的例子都在 Ubuntu 14.04LTS 中进行了测试。我们使用的命令行 shell 是 bash(4.3.11 版本)。

Linux 中的命令行别名

按照外行人的定义,别名可以被认为是一个复杂命令或者一组命令(包括它们的参数和选项)的简称或缩写。所以基本上,使用别名,你可以为那些不那么容易书写/记忆的命令创建易于记忆的名称。

例如,下面的命令为 cd ~ 命令创建别名 home

alias home="cd ~"

这意味着现在在你的系统中无论何地,无论何时你想要回到你的主目录时,你可以很快地输入 home 然后按回车键实现。

关于 alias 命令,man 手册是这么描述的:

alias 工具可以创建或者重定义别名定义,或者把现有别名定义输出到标准输出。别名定义提供了输入一个命令时应该被替换的字符串值

一个别名定义会影响当前 shell 的执行环境以及当前 shell 的所有子 shell 的执行环境。按照 IEEE Std 1003.1-2001 规定,别名定义不应该影响当前 shell 的父进程以及任何 shell 调用的程序环境。

那么,别名到底如何帮助命令行导航呢?这是一个简单的例子:

假设你正在 /home/himanshu/projects/howtoforge 目录工作,它包括很多子目录以及子子目录。例如下面就是一个完整的目录分支:

/home/himanshu/projects/howtoforge/command-line/navigation/tips-tricks/part4/final

现在想象你在 final 目录,然后你想回到 tips-tricks 目录,然后再从那里,回到 howtoforge 目录。你会怎么做呢?

是的,一般情况下,你会运行下面的一组命令:

cd ../..

cd ../../..

虽然这种方法并没有错误,但它绝对不方便,尤其是当你在一个很长的路径中想往回走例如说 5 个目录时。那么,有什么解决办法吗?答案就是:别名。

你可以做的是,为每个 cd .. 命令创建容易记忆(和书写)的别名。例如:

alias bk1="cd .."  
alias bk2="cd ../.."  
alias bk3="cd ../../.."  
alias bk4="cd ../../../.."  
alias bk5="cd ../../../../.."

现在无论你什么时候想从当前工作目录往回走,例如说 5 个目录,你只需要运行下面的命令:

bk5

现在这不是很简单吗?

相关细节

尽管当前我们在 shell 中用于定义别名的技术(通过使用 alias 命令)实现了效果,别名只存在于当前终端会话。很有可能你会希望你定义的别名能保存下来,使得此后你可以在任何新启动的命令行窗口/标签页中使用它们。

为此,你需要在 ~/.bash_aliases 文件中定义你的别名,你的 ~/.bashrc 文件默认会加载该文件(如果你使用更早版本的 Ubuntu,我没有验证过是否有效)。

下面是我的 .bashrc 文件中关于 .bash_aliases 文件的部分:

# Alias definitions.
# You may want to put all your additions into a separate file like
# ~/.bash_aliases, instead of adding them here directly.
# See /usr/share/doc/bash-doc/examples in the bash-doc package.

if [ -f ~/.bash_aliases ]; then 
      . ~/.bash_aliases
fi

一旦你把别名定义添加到你的 .bash_aliases 文件,该别名在任何新终端中都可用。但是,在任何其它你定义别名时已经启动的终端中,你还不能使用它们 - 解决办法是在这些终端中重新加载 .bashrc。下面就是你需要执行的具体命令:

source ~/.bashrc

如果你觉得这要做的也太多了(是的,我期待你有更懒惰的办法),那么这里有一个快捷方式来做到这一切:

"alias [the-alias]" >> ~/.bash_aliases && source ~/.bash_aliases

毫无疑问,你需要用实际的命令替换 [the-alias]。例如:

"alias bk5='cd ../../../../..'" >> ~/.bash_aliases && source ~/.bash_aliases

接下来,假设你已经创建了一些别名,并时不时使用它们有一段时间了。突然有一天,你发现它们其中的一个并不像期望的那样。因此你觉得需要查看被赋予该别名的真正命令。你会怎么做呢?

当然,你可以打开你的 .bash_aliases 文件在那里看看,但这种方式可能有点费时,尤其是当文件中包括很多别名的时候。因此,如果你正在查找一种更简单的方式,这就有一个:你需要做的只是运行 alias 命令并把别名名称作为参数。

这里有个例子:

$ alias bk6
alias bk6='cd ../../../../../..'

你可以看到,上面提到的命令显示了被赋值给别名 bk6 的实际命令。这里还有另一种办法:使用 type 命令。下面是一个例子:

$ type bk6
bk6 is aliased to `cd ../../../../../..'

type 命令产生了一个易于人类理解的输出。

另一个值得分享的是你可以将别名用于常见的输入错误。例如:

alias mroe='more'

最后,还值得注意的是并非每个人都喜欢使用别名。他们中的大部分人认为一旦你习惯了你为了简便而定义的别名,当你在其它相同而不存在别名(而且不允许你创建)的系统中工作时就会变得非常困难。更多(也是更准确的)为什么一些专家不推荐使用别名的原因,你到这里查看。

总结

就像我们之前文章讨论过的 CDPATH 环境变量,别名也是一把应该谨慎使用的双刃剑。尽管如此也别太丧气,因为每个东西都有它自己的好处和劣势。遇到类似别名的概念时,更多的练习和完备的知识才是重点。

那么这就是该系列指南的最后章节。希望你喜欢它并能从中学到新的东西/概念。如果你有任何疑问或者问题,请在下面的评论框中和我们(以及其他人)分享。


via: https://www.howtoforge.com/tutorial/command-line-aliases-in-linux/

作者:Ansh 译者:ictlyh 校对:wxy

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

在这个系列的第一部分,我们详细地讨论了 cd - 命令,在第二部分,我们深入探究了 pushdpopd 两个命令,以及它们使用的场景。

继续对命令行的讨论,在这篇教程中,我们将会通过简单易懂的实例来讨论 CDPATH 这个环境变量。我们也会讨论关于此变量的一些进阶细节。

在这之前,先声明一下此教程中的所有实例都已经在 Ubuntu 14.04 和 4.3.11(1) 版本的 Bash 下测试过。

环境变量 CDPATH

即使你的命令行所有操作都在特定的目录下 - 例如你的主目录,然而在你切换目录时也不得不提供绝对路径。比如,考虑我现在的情况,就是在 /home/himanshu/Downloads 目录下:

$ pwd
/home/himanshu/Downloads

现在要求切换至 /home/himanshu/Desktop 目录,我一般会这样做:

cd /home/himanshu/Desktop/

或者

cd ~/Desktop/

或者

cd ../Desktop/

能不能只是运行以下命令就能简单地实现呢:

cd Desktop

是的,这完全有可能。这就是环境变量 CDPATH 出现的时候了。你可使用这个变量来为 cd 命令定义基础目录。

如果你尝试打印它的值,你会看见这个环境变量默认是空值的:

$ echo $CDPATH

现在 ,考虑到上面提到的场景,我们使用这个环境变量,将 /home/himanshu 作为 cd 命令的基础目录来使用。

最简单的做法这样:

export CDPATH=/home/himanshu

现在,我能做到之前所不能做到的事了 - 当前工作目录在 /home/himanshu/Downloads 目录里时,成功地运行了 cd Desktop 命令。

$ pwd
/home/himanshu/Downloads
$ cd Desktop/
/home/himanshu/Desktop
$

这表明了我可以使用 cd 命令来到达 /home/himanshu 下的任意一个目录,而不需要在 cd 命令中显式地指定 /home/himanshu 或者 ~,又或者是 ../ (或者多个 ../)。

要点

现在你应该知道了怎样利用环境变量 CDPATH/home/himanshu/Downloads/home/himanshu/Desktop 之间轻松切换。现在,考虑以下这种情况, 在 /home/himanshu/Desktop 目录里包含一个名字叫做 Downloads 的子目录,这是将要切换到的目录。

但突然你会意识到 cd Downloads 会切换到 /home/himanshu/Downloads。所以,为了确保这不会发生,你可以这样做:

cd ./Downloads

虽然上述命令本身没有问题,但你还是需要耗费点额外的精力(虽然很小),尤其是每次这种情况发生时你都不得不这样做。所以,有一个更加优雅的解决方案来处理,就是以如下方式来设定 CDPATH 环境变量。

export CDPATH=".:/home/himanshu"

它的意思是告诉 cd 命令先在当前的工作目录查找该目录,然后再尝试搜寻 /home/himanshu 目录。当然, cd 命令是否以这样的方式运行,完全取决于你的偏好和要求 - 讨论这一点的目的是为了让你知道这种情况可能会发生。

就如你现在所知道的,一旦环境变量 CDPATH 被设置,它的值 - 或者它所包含的路径集合 - 就是系统中 cd 命令搜索目录的地方 ( 当然除了使用绝对路径的场景 )。所以,完全取决于你来确保该命令行为的一致性。

继续说,如果一个 bash 脚本以相对路径使用 cd 命令,最好还是先清除或者重置环境变量 CDPATH,除非你觉得遇上不可预测的麻烦也无所谓。还有一个可选的方法,比起在终端使用 export 命令来设置 CDPATH,你可以在测试完当前的 shell 是交互式还是非交互式之后,再在你的 .bashrc 文件里设置环境变量,这样可以确保你对环境变量的改动只对交互式 shell 生效。

环境变量中,路径出现的顺序同样也是很重要。举个例子,如果当前目录是在 /home/himanshu 目录之前列出来,cd 命令就会先搜索当前的工作目录然后才会搜索 /home/himanshu 目录。然而,如果该值为 /home/himanshu:.,搜索就首先从 /home/himanshu 开始,然后到当前目录。不用说,这会影响 cd 命令的行为,并且不注意路径的顺序可能会导致一些麻烦。

要牢记在心的是,环境变量 CDPATH,就像其名字表达的,只对 cd 命令有作用。意味着在 /home/himanshu/Downloads 目录里面时,你能运行 cd Desktop 命令来切换到 /home/himanshu/Desktop 目录,但你不能使用 ls。以下是一个例子:

$ pwd
/home/himanshu/Downloads
$ ls Desktop
ls: cannot access Desktop: No such file or directory
$

然而,这还是有简单的变通处理的。例如,我们可以用以下不怎么费力的方式来达到目的:

$ cd Desktop/;ls
/home/himanshu/Desktop
backup backup~ Downloads gdb.html outline~ outline.txt outline.txt~

不过,不是每种情况就能变通处理的。

另一个重点是:就像你可能已经观察到的,每次你使用 CDPATH 环境变量集来运行 cd 命令时,该命令都会在输出里显示你切换到的目录的完整路径。不用说,不是所有人都想在每次运行 cd 命令时看到这些信息。

为了确保该输出被制止,你可以使用以下命令:

alias cd='>/dev/null cd'

如果 cd 命令运行成功,上述命令不会输出任何东西,如果失败,则允许产生错误信息。

最后,假如你遇到设置 CDPATH 环境变量后,不能使用 shell 的 tab 自动补全功能的问题,可以尝试安装并启用 bash 自动补全(bash-completion)。更多请参考 这里

总结

CDPATH 环境变量时一把双刃剑,如果没有掌握完善的知识和随意使用,可能会令你陷入困境,并花费你大量宝贵时间去解决问题。当然,这不代表你不应该去试一下;只需要了解一下所有的可用选项,如果你得出结论,使用 CDPATH 会带来很大的帮助,就继续使用它吧。

你已经能够熟练地使用 CDPATH 了吗?你有更多的贴士要分享?请在评论区里发表一下你的想法吧。

(高清版题图:http://anguerde.com/TTF-222621-archlinux.html


via: https://www.howtoforge.com/tutorial/linux-command-line-tips-tricks-part-3-cdpath/

作者:Ansh 译者:HaitaoBio 校对:jasminepeng

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