2017年2月

Windows 用户们,去还是留?

Windows 依然是高居榜首的桌面操作系统,占据 90% 以上的市场份额,远超 macOS 和 Linux 。

从数据来看,尽管 linux 并不是 Windows 的头号接班人,但近几年越来越多用户转向 Ubuntu、Linux Mint 等发行版,的确为 Linux 带来了不小的增长。

面对 Windows 10 发布以来招致的诸多批评,微软后来采取的激进升级策略也明显无济于事。很多用户抱怨在不知情的情况下就被升级到了 Windows 10 ,这也促使部分用户决定放弃微软产品而转向 Linux 。

同时也有声音指责微软试图通过 Windows 10 监视用户,同样,这些批评助推更多用户投入 Linux 阵营。

你怎么选: Windows or Linux?

十几年前,用户转向 Linux 还主要是出于安全考虑,因为 Windows 才是全世界病毒和黑客的主要攻击目标。

这有它的必然原因: Windows 是被最广泛采用的操作系统,但那时微软在安全上的设计并没有今天这样实用。

而近几年,尽管 Linux 和 Windows 在安全方面的差距已没有那么明显,但那些决定转阵营的用户似乎又有了除安全以外的其它理由。

我们不想用什么市场统计来说明问题,因为在这场 Windows 和 Linux 的持久战中,这些数据显得无关紧要。但是用户的声音却至关重要,因为它们总能代表并预示各个平台的走向。

这也是为什么我们在这里向读者提出问题: Linux 是 Windows 合适的替代品么?放弃 Windows 而选择 Linux 是否明智?微软是否该为用户流向 Linux 而感到紧张?请在评论中留下您的看法。


via: http://news.softpedia.com/news/let-s-chat-windows-vs-linux-512842.shtml

作者:Bogdan Popa 译者:Dotcra 校对:wxy

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

目前,在我们讲述 Vim 的教程中,讨论过编辑器的 模式行 Modeline 功能以及怎样用插件来扩展 Vim 的功能集。可正如我们所知,Vim 提供了非常多的内置功能:因此在本教程中更进一步,我们来谈谈在该编辑器启动时的可用模式。

但在我们开始之前,请注意在本教程中提及的所有例子、命令及用法说明都是在 Ubuntu 14.04 上测试的,我们测试用的 Vim 版本是 7.4 。

Vim 中的兼容模式与不兼容模式

为了更好理解上述的 Vim 模式,你有必要先去了解下此编辑器初始化过程的一个重要方面。

系统级及本地 vimrc 文件

当 Vim 启动时,编辑器会去搜索一个系统级的 vimrc 文件来进行系统范围内的默认初始化工作。

这个文件通常在你系统里 $VIM/vimrc 的路径下,如果没在那里,那你可以通过在 Vim 里面运行 :version 命令来找到它的正确存放位置。比如说,在我这里,这个命令的相关部分的输出结果如下:

...
...
...
system vimrc file: "$VIM/vimrc"
user vimrc file: "$HOME/.vimrc"
2nd user vimrc file: "~/.vim/vimrc"
user exrc file: "$HOME/.exrc"
fall-back for $VIM: "/usr/share/vim"
...
...
...

可以看到那个系统 vimrc 文件确实位于 $VIM/vimrc ,但我检查了我机子上没设置过 $VIM 环境变量。所以在这个例子里 - 正如你在上面的输出所看到的 - $VIM 在我这的路径是 /usr/share/vim ,是一个回落值(LCTT 译注:即如果前面失败的话,最终采用的结果)。于是我试着在这个路径寻找 vimrc ,我看到这个文件是存在的。如上即是我的系统 vimrc 文件,就如前面提过的那样 - 它在 Vim 启动时会被读取。

在这个系统级 vimrc 文件被读取解析完后,编辑器会查找一个用户特定的(或者说本地的)vimrc 文件。这个本地 vimrc 的搜索顺序是:环境变量 VIMINIT$HOME/.vimrc、环境变量 EXINIT, 和一个叫 exrc 的文件。通常情况下,会存在 $HOME/.vimrc~/.vimrc 这样的文件,这个文件可看作是本地 vimrc。

我们谈论的是什么兼容性

就像我们谈论 Vim 的兼容性模式和不兼容性模式那样,这些模式的开启和禁用会做出什么样的兼容性也值得了解。要了解这些,先要知道 Vim 是 VIMproved 的缩写,像这个全名暗示的那样,Vim 编辑器是 Vi 编辑器的改进版。

经过改进意味着 Vim 的功能集比 Vi 的更大。为了更好的理解这俩编辑器的区别,点这里

当谈论 Vim 的兼容和不兼容模式时,我们所说的兼容性是指 Vim 兼容 Vi。在兼容模式下运行时,Vim 大部分增强及改善的功能就不可用了。不管怎样,要记住这种模式下,Vim 并不能简单等同 Vi - 此模式只是设定一些类似 Vi 编辑器工作方式的默认选项。

不兼容模式 - 不用多说 - 使得 Vim 用起来跟 Vi 不兼容,也使得用户可以用到它的所有增强、改善及特征。

怎么启用/禁用这些模式?

在 Vim 中尝试运行 :help compatible 命令,接着你会看到如下语法:

'compatible' 'cp' boolean (默认开启 ,当 |vimrc| 或 |gvimrc| 存在时关闭)

描述中说到兼容模式默认开启的,不过当 vimrc 文件存在时会关闭。但说的是哪种 vimrc 文件呢?答案是本地 vimrc。深入研究下 :help compatible 命令给出的详情,你会发现下面内容说得更清楚:

事实上,这意味着当一个 |vimrc| 或 |gvimrc| 文件存在时,Vim 会用默认的 Vim,否则它会用 Vi 默认的。(注:如果系统级的 vimrc 或 gvimrc 文件中带有 |-u| 参数,则不会这样。)。

那么在 Vim 启动时,实际上进行的动作是,首先会解析系统 vimrc 文件 - 在这时处于兼容性模式默认开启状态。现在,无论何时发现一个用户(或成为本地) vimrc ,不兼容模式都会打开。:help compatible-default命令说的很清楚:

在 Vim 启动时,‘compatible’选项是打开的。这将在 Vim 开始初始化时应用。但是一旦之后发现用户级 vimrc 文件,或在当前目录有一个 vimrc 文件,抑或是 VIMINIT 环境变量已设置,Vim 就会被设为不兼容模式。

假如你想无视默认的行为,要在编辑器开始解析系统 vimrc 文件时打开不兼容模式,你可以通过添加如下命令到那个文件的开头来完成这个操作。

:set nocompatible

其他有用细节

这儿是一些关于这些模式的更有用的细节:

现在通过创建一个 .vimrc 文件来设置或重置兼容性会有一个副作用:(键盘)映射(Mapping)在解释的时候会有冲突。这使得在用诸如回车控制符 <CR> 等情况时会有影响。如果映射关系依赖于兼容性的某个特定值,在给出映射前设置或者重置它。

上述行为能够用以下方式能覆盖:

  • 如果给出 -N 命令行参数,即使不存在 vimrc 文件, ‘不兼容模式’ 也会启用。
  • 如果给出 -C 命令行参数,即使存在 vimrc 文件, ‘兼容模式’ 也会启用。
  • 如果应用了 -u {vimrc} 参数,‘兼容模式’将会启用。
  • 当 Vim 的可执行文件的名称以 ex 结尾时,那这个效果跟给出 -C 参数一样:即使存在一个 vimrc 文件,‘兼容模式’ 也会启用,因为当 Vim 以 “ex” 的名称启用时,就会让 Vim 的工作表现得像 “前任” 一样(LCTT 译注:意即 Vim 像 Vi 一样工作)。 `

结论

我们都觉得,你可能不会发现你自己有机会处于一种你需要打开 Vim 的 Vi 兼容模式的情形中,但是那并不意味着你应该不知道 Vim 编辑器的初始化过程。毕竟,你绝不会知道这些知识什么时候会帮到你。


via: https://www.howtoforge.com/tutorial/vim-editor-modes-explained/

作者:Himanshu Arora 译者:ch-cn 校对:wxy

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

如果一个系统被多个用户使用,你或许出于个人原因想在文件管理器中隐藏一些文件或文件夹不让其他人看到(绝大多数用户不会对 Linux 系统进行深入了解,所以他们只会看到文件管理器列出的文件和文件夹),我们有三种方法可以来做这件事。此外,(除了隐藏)你还可以使用密码保护文件或文件夹。在这个教程中,我们将讨论如何用非重命名的方法在文件管理器中隐藏文件和文件夹。

我们都知道,通过以点(“.”)前缀重命名一个文件或文件夹的方式,可以在 Linux 中将该文件或文件夹隐藏。但这不是隐藏文件或文件夹的正确/高效方式。一些文件管理器也隐藏文件名以波浪号(“~”)结尾的文件,那些文件被认为是备份文件。

在文件管理器中隐藏文件或文件夹的三种方法:

  • 给文件或文件夹名添加一个点(“.”)前缀。
  • 创建一个叫做 .hidden 的文件,然后把需要隐藏的文件或文件夹加到里面。
  • 使用 Nautilus Hide 扩展

通过点(“.”)前缀隐藏文件或文件夹

这是每个人都知道的方法,因为默认情况下文件管理器和终端都不会显示以点(“.”)作为前缀的文件或文件夹。要隐藏一个现有文件,我们必须重命名它。这种方法并不总是一个好主意。我不推荐这种方法,在紧急情况下你可以使用这种方法,但不要特意这样做。

为了测试,我将创建一个叫做 .magi 的新文件夹。看下面的输出,当我使用 ls -lh 命令时,不会显示以点(“.”)作为前缀的文件或文件夹。在文件管理器中你也可以看到相同的结果。

# mkdir .magi

# ls -lh
total 36K
-rw-r--r-- 1 magi magi  32K Dec 28 03:29 nmon-old

文件管理器查看。

为了澄清一下,我在 ls 命令后面加上 -a 选项来列出被隐藏文件(是的,现在我可以看到文件名 .magi 了)。

# ls -la
total 52
drwxr-xr-x  4 magi magi  4096 Feb 12 01:09 .
drwxr-xr-x 24 magi magi  4096 Feb 11 23:41 ..
drwxr-xr-x  2 magi magi  4096 Feb 12 01:09 .magi
-rw-r--r--  1 magi magi 32387 Dec 28 03:29 nmon-old

为了查看文件管理器中的被隐藏文件,只需按 Ctrl+h 快捷键,再次按 Ctrl+h 又可以把这些文件隐藏。

用非重命名方法,通过 “.hidden” 文件的帮助隐藏文件或文件夹

如果你想用非重命名的方法隐藏一个文件,或者一些应用不允许重命名。在这种情况下,你可以使用 .hidden 文件,它可能是最适合你的选择。

一些文件管理器,比如 Nautilus、Nemo、Caja 和 Thunar,提供了一种很原始的方法来隐藏文件,不需要重命名。怎样做?只需在想要隐藏文件的地方创建一个叫做 .hidden 的文件,然后把想隐藏的文件和文件夹列表一行一个地加进来。最后,刷新文件夹,那些文件将不显示出来。

为了测试,我将在同一目录下创建一个叫做 .hidden 的文件和两个分别叫做 2g2daygeek 的文件/文件夹,然后把它们加到 .hidden 文件中。

# touch 2g
# mkdir 2daygeek

# nano .hidden
2g
2daygeek

将两个文件加到 .hidden 文件之前。

将两个文件加到 .hidden 文件之后。

通过按 Ctrl+h 显示所有文件。

Nautilus Hide 扩展

Nautilus Hide 是针对 Nautilus 文件管理器的一个简单的 Python 扩展,它在右键菜单中增加了隐藏或显示被隐藏文件的选项。

要在 Ubuntu 及其衍生版上安装 Nautilus 和 Namo 的 Hide 扩展,我们可以在 Ubuntu 及其衍生版上通过运行下面的命令:

$ sudo apt install nautilus-hide
$ nautilus -q

$ sudo apt install nemo-hide
$ nemo -q

对于基于 DEB 的系统,可以按照下面的步骤安装 Nautilus Hide 扩展:

$ sudo apt install cmake gettext python-nautilus xdotool
$ mkdir build
$ cd build
$ cmake ..
$ sudo make
$ sudo make install
$ nautilus -q

对于基于 RPM 的系统,按照下面的步骤安装 Nautilus Hide 扩展:

$ sudo [yum|dnf|zypper] install cmake gettext nautilus-python xdotool
$ mkdir build
$ cd build
$ cmake ..
$ sudo make
$ sudo make install
$ nautilus -q

这个扩展其实就是简单的使用 .hidden 文件来隐藏文件。当你选择隐藏一个文件时,它的名字就加入到 .hidden 文件。当你选择对它解除隐藏(为解除隐藏,按 Ctrl+h 快捷键来显示包括点(“.”)前缀在内的所有文件,然后选择 解除隐藏文件 Unhide Files )时,它的名字就从 .hidden 文件中移除(当把所有列在 .hidden 文件中的文件都解除隐藏以后, .hidden 文件也就随之消失了)。如果文件没有被隐藏/显示,请按 F5 来刷新文件夹。

你可能会问,方法二也能完成相同的事情,为什么我还要安装 Nautilus Hide 扩展。在方法二中,我需要在要隐藏文件的地方手动创建一个 .hidden 文件,然后必须把需要隐藏的文件加到其中,但在这儿一切都是自动的。简单的右键单击,然后选择隐藏或取消隐藏(如果 .hidden 文件还不存在,它会自动创建 )。

使用 Nautilus Hide 扩展来隐藏一个文件。

看下面的屏幕截图,我们使用 Nautilus Hide 扩展来隐藏一个文件。

使用 Nautilus Hide 扩展来解除文件隐藏。

看下面的屏幕截图,我们使用 Nautilus Hide 扩展解除对一个文件的隐藏(通过按 Ctrl+h, 你可以查看所有的被隐藏文件和文件夹)。


via: http://www.2daygeek.com/how-to-hide-files-and-folders-in-file-manager-without-renaming/

作者:MAGESH MARUTHAMUTHU 译者:ucasFL 校对:jasminepeng

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

在 Linux 中为什么会有一个名为 root 的特定账户?该怎么使用 root 账户?它在哪些场景下必须使用,哪些场景下不能使用?对于以上几个问题,如果您感兴趣的话,那么请继续阅读。

本文中,我们提供了一些关于 root 账户的参考资料,方便您了解。

root 是什么?

首先,记住这一点,在 Unix 类操作系统中,目录的层级结构被设计为树状结构。起始目录是一个特殊目录,使用斜杠 / 表示,而其他目录都是由起始目录分支而来。由于这种结构很像现实中的树,所以 / 也被称为 root 目录。

下图,我们可以看到以下命令的输出:

$ tree -d / | less

该命令主要是演示一下 / 根目录和树 root 的类比。

Linux 的目录层级

Linux 的目录层级

虽然 root 账户命名的原因还不是很清楚,可能是因为 root 账户是唯一一个在根目录 / 中有写权限的账号吧。

此外,由于 root 账户可以访问 Unix 类操作系统中的所有文件和命令,因此,它也常被称为超级用户。

另外,根目录 //root 目录不能混淆了,/root 目录是 root 账户的家目录。实际上,/root 目录是根目录 / 的子目录。

获取 root 权限

当我们说到 root(或者超级用户)权限的时候,我们指的是这样一种账户的权限:其在系统上的权限包含(但不限于)修改系统并授权其他用户对系统资源的访问权限。

胡乱使用 root 账户,轻则系统崩溃重则系统完全故障。这就是为什么会说,以下准则是使用 root 账户的正确姿势:

首先,使用 root 账户运行 visudo 命令编辑 /etc/sudoers 文件,给指定账户(如:supervisor)授予最低的超级用户权限。

最低超级用户权限可以包含,例如:添加用户 (adduser)修改用户 (usermod)等权限。

接着,使用 supervisor 账户登录并使用 sudo 执行用户管理任务。此时,你可能会发现,当你执行需要超级用户权限(例如:删除软件包)的其它任务时,会失败。

没有使用超级用户权限运行命令

没有使用超级用户权限运行命令

在必须使用超级用户权限时,重复执行以上两个步骤,一旦执行完成,则立即使用 exit 命令退回到无特限的账户。

此时,你需要确定一下其他周期性的任务是否需要超级用户权限?如果需要,那么在 /etc/sudoers 中,给指定的账户或组授予必要的权限,尽量避免直接使用 root 账户操作。

摘要

本文可以作为在 Unix 类操作系统中正确使用 root 账户的简单参考。收藏一下,你就可以随时翻阅!

还是一样,如果您对本文有什么疑问或建议,请使用以下的评论表单给我们评论留言,期待您的回音!


作者简介:

Gabriel Cánepa 来自 Villa Mercedes, San Luis, Argentina。他是一名 GNU/Linux 系统管理员和 Web 开发员,现在一家全球领先的消费品公司就职。他很喜欢使用 FOSS 工具来提高自己的工作效率。


via: http://www.tecmint.com/who-is-root-why-does-root-exist-in-linux/

作者:Gabriel Cánepa 译者:zhb127 校对:wxy

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

科技世界的探索总是让我们兴奋不已。很多科技日新月异,你探索得越深远,你看到的世界就越广阔无穷,这就像是一只驼一只的海龟一样。因此,科技世界也像宇宙一样无穷无尽。如果你也渴望加入到推动技术世界发展的社区中,你应该如何开始呢?你要做的第一步是什么?以后应该怎么做?

首先,你得明白开源指的是开放软件源代码的意思。这个很好理解,但是“开源”这个词最近一段时间经常出现在我们身边,所以估计有时候大家都忘记了开源只是用来形容一种文化现象,而不是一家世界 500 强公司的名字。跟其它公司或组织不同的是,你不用去参加面试或填个申请表、注册表的方式来成为一名开源程序员。你需要做的就是编程,然后把代码共享出来,并且完全保证在任何情况下该代码都保持开放状态。

只需要这样,你就已经成为一名开源程序员了!

现在你有了目标,那么你为之奋斗的基础能力怎么样了?

技能树

你玩过 RPG 游戏吗?在那些游戏中就有关于线性“技能树”的概念。当你玩游戏时,你掌握了基本技能后,便会“升级”,并且获得新的技能,然后你使用这些新的技能再次“升级”到一个更高的等级,你又会得到更多新的技能。通过这样不断的升级,获取新技能,以让你的游戏角色变得更强大。

成为一个程序员有点像提升你的技能树等级。你掌握了一些基础的技术,在参与开源项目开发的过程中,你不断实践,直至自己的技术等级上升到一个新的层次,之后你又懂了一些新的技术,并在项目开发过程中不断实践,不断提升技术等级,然后你再沿着这个技能树不断成长,不断进步。

你会发现自己面临的不只一棵技能树。开源软件涉及到的技术比较多,包括很多参与者自身的优势、能力及兴趣爱好等。然而,有一些非常重要的技能有助于你成为一名伟大的程序员,不断的提高这些技能是成功参与到开源项目中的重要组成部分。

脚本编程

对于像 Linux 或 BSD 系统这样的 POSIX 系统而言,最大的优势之一就是在你每次使用电脑的过程中,你都有机会练习编程。如果你不知道如何开始编程,你可以从解决工作中的一些基本问题做起。想想你日常工作中有哪些重复性的工作,你可以通过编写脚本的方式来让它们自动执行。这一步非常简单,比如说批量转换文件格式或重置图片的大小、检查邮件,甚至是通过单击运行你最常用的五个应用程序。无论是什么任务,你可以花一些时间去编写脚本以让它们自动完成。

如果有些工作需要在控制终端下操作,那么你就可以编写脚本来完成。学习 bash 或 tsch 编程,把编写系统脚本作为你写代码和理解系统的工作原理的第一步。

系统管理

从这一点来讲,你也可以转变成一个程序员,也可以整个跳到另外一个不同的技能树上:那就是系统管理工作。跟程序员比起来,这两个职业在技能上有一些相似(一个优秀的系统管理员应该有一些编程经验,并能够熟练使用 Python、Perl,或者其它类似的编程言语来解决一些独特的问题),而程序员指的是那些一直编写代码的人。

程序员

开源是学习编程技巧最好的方式:你可以查看其他人写的代码,从中借鉴他们的想法和技术,从他们的错误中学习,并跟自己写的代码进行对比以发现两者的优缺点;如果你是使用 Linux 或 BSD 操作系统,整个环境对你来说都是开放的,目之所及,随心所欲。

这就像旅游指南里所说的,随意行去。事实上你不大会去深入到一个项目的源代码中,但是如果这样的话,可以让你在某一时刻突然意识到自己会编程了。编程是一份很难的技术活,否则大家都可以从事编程工作了。

幸运的是,编程是有逻辑而结构化的,这些特性跟编程语言相关。你也许不会深入的去研究编程,但是你研究得越深,你懂的越多。

懂得如何控制以及让电脑自动执行任务是一回事,但是知道如何编写其它人想自动实现任务的代码,才能说明你已经真正进入到编程领域了。

精通多种编程语言

所有的编程语言都旨在处理相同的任务:让计算机能够完成计算工作。选择一种编程语言时你得考虑以下几个因素,学编程的目的是什么,你所做的工作最常用的编程语言是什么,你最容易理解哪一种编程语言以及你的学习方式。

随便查下相关资料,你就可以了解编程语言的复杂性了,然后再根据自己的能力水平来决定先学习哪种编程语言。

选择编程语言的另一个方式是根据你的使用目的来决定,看看你身边的同事使用哪种编程语言。如果你是为了开发桌面环境的工具,你应该学习 C 语言和 Vala 语言,或者 C++ 语言。

总之,不要在各种编程语言之间不知所措。编程语言之间都是相通的。当你学好一种编程语言并能用它来解决工作中的一些实际问题的时候,你会发现学习另外一种编程语言更容易。毕竟,编程语言只是一些语法和相关规则的集合;学会一种编程语言后,再使用同样的方法去搞懂另外一种语言完全不是个事。

主要目的还是学会一种编程语言。选择一个比较适合自己或者你感兴趣的编程语言,或者是你的朋友在用的编程语言,或者是选择文档比较丰富,并且你理解起来也容易的编程语言,但是,最好是只关注并先学会其中的一种编程语言。

这是一个开源项目吗?

无论你是编程新手还是一个老司机,在你进入到开源新世界之前,你需要搞明白做开源软件的重要一点就是“开放源代码”。

最近一些厂商惯用的市场营销策略就是宣称他们的软件是开源的。然而,有些厂商只是发布了一个公共的 API 或者表示他们愿意接受其它开源用户提交的代码而已。“开源”这个词不是一个商标,并且也没有任何组织来决定怎么使用这个词。但是, Debian Linux 创造人 Ian Murdock 联合成立的 开放源代码促进会 Open Source Initiative 对开源这个词进行了定义(授权“允许软件被用户自由地使用、随意修改及分享”),并且被正式批准和授予许可证的软件才属于真正的开源软件。

给你的软件代码应用一个开源许可证,你就成为一名开源程序员了。恭喜你!

开源社区

咨询任何开源软件爱好者,他们会告诉你开源软件最关键的是人。没有积极的开源贡献者,软件开发就会中止。计算机需要用户、提交缺陷的人、设计师及程序员。

如果你想加入全球开源社区为开源软件做贡献,你同样需要成为该社区的一个成员,即使你并不善于社交也不要紧。这通常包括订阅邮件列表、加入 IRC 频道,或者在论坛里表现活跃,从最低级别开始。任何成熟的开源社区都已经存在了足够长的时间,见惯了来来往往的人们,所以,在你真正融入这个世界、在他们接纳你之前,你需要证明出你并非流星一逝般的过客,如果你想要做成一件大事,那就得有长期投身于其中的打算。

如果你只是想给他们提供一些小的帮助,这也是可以接受的。我自己也提交一些小的补丁到一些项目中,有时候项目管理者会觉得这个更新比较好,有时候他们也会拒绝我提交的代码补丁。但是,如果这个被拒绝的补丁对我很重要,我就会为我自己和客户维护它,并一直维护下去。

这就是参与到开源项目。

但是这些社区在哪里呢?这个跟开源项目有关。有些项目有专职的社区管理员,他们会把所有的社区参与者招集到一个打大家都能访问的地方。有些项目则围绕论坛运行,他们使用邮件列表,或者使用问题追踪器与参与者联系。找到这些开源社区对你来说也不是个事儿。

还有个重要的事情就是研究他们的源代码。“开源”就是开放“源代码”,所以你可以把他们的代码拿来瞅瞅。尽管要全面了解他们的项目可能超乎你的能力,但是你可以知道这个项目是如何管理的,他们最可能需要帮助的是什么。关于代码是如何组织的?这些代码有注释吗?它们使用统一的程序风格吗?这些问题你可以查阅相关文档,尤其是 README、 LICENSE ,或者是 COPYING 这几个文件。

不要低估遵守开放源代码承诺的重要性。这是你被允许参与进来到开源项目来的原因,因此,你得深入地考虑下你能从中学习到什么,以及你将如何为该项目提供帮助。

找到最佳的开源社区更像是约妹子,尤其是更像在《偷天情缘》)里的约会。这需要时间,并且刚开始那几次有可能会失败。你参与这样的聚会越多,你就越了解这些开源项目。最后,你会更了解自己,当你找到了与其它参与者融为一体的方式时,你就已经成功了。总之,你得要有耐心,一切顺其自然。

行动比语言更重要

作为一名开源程序员最重要的是写代码(开源中的“源”),任何想法都没多少意义。关键是把你的想法变成实际的东西。你要让大家都知道你在做什么、知道你不怕苦不怕累,也愿意在开源项目上花时间,并且能够通过编程的方式来实现自己的各种想法。

为了更高效地完成那些工作,你需要对开源项目做做功课,包括项目怎么样才能听取你的建议、哪个分支是稳定的哪个是开发的等等。

从下面几点开始:

  • 熟悉一个项目及其协作开发的氛围,并且接受这种氛围。
  • 编写软件升级包、缺陷修复包,或者一些小的功能需求,并且提交它们。
  • 如果你提交的补丁被拒绝了,也不要难过。他们拒绝的不是你个人,而是开发小组在针对你提交的代码进行评估后作出的一个反馈。
  • 如果你提交的代码被改得面目全非后才被接受也不要泄气。
  • 从头再来,不断努力,再接受更大的挑战。

在开源项目中不应该开设排行榜。然而,有些开源社区却弄了个贡献排名,其实这没必要。大家只需要积极参与、奉献,贡献你的才智、提交你的代码,这样就可以了。

开发软件

编程不管在那种情况下都关乎于你自身的发展。无论你是否为了寻找解决问题的新方法,寻找优化代码的方式,学习新的编程语言,或者是学习如何更好的与其它人员合作,你都不会停止成长。你自己成长得越多,对开源项目越有帮助。

个人成长和职业技能的提升是你参与开源项目的终极目标,但是实际上这是一个贯穿整个项目的持续过程。成为一个开源程序员跟得到一份公务员工作不同;这是一个持之以恒的过程。学习、分享、再学习,或许你会去编写一个“康威生命游戏”,然后你会学到越来越多。

这就是开源的过程:自由地开发,每一行代码。因此,发现你的技能树,激发潜能,付出努力,不断提高自己的技能,并最终参与其中。

(题图素材修改自:woot.com


作者简介:

Seth Kenlon —— Seth Kenlon 是一位独立多媒体艺术家,开源文化倡导者, Unix 极客。他还是 Slackware 多媒体产品项目的维护人员之一,官网:http://slackermedia.ml


via: https://opensource.com/article/17/1/how-get-started-open-source-programmer

作者:Seth Kenlon 译者:rusking 校对:Bestony, wxy

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

 title=

世界上对 shell 脚本最好的概念性介绍来自一个老的 AT&T 培训视频 。在视频中,Brian W. Kernighan(awk 中的“k”),Lorinda L. Cherry(bc 作者之一)论证了 UNIX 的基础原则之一是让用户利用现有的实用程序来定制和创建复杂的工具。

Kernighan 的话来说:“UNIX 系统程序基本上是 …… 你可以用来创造东西的构件。…… 管道的概念是 [UNIX] 系统的基础;你可以拿一堆程序 …… 并将它们端到端连接到一起,使数据从左边的一个流到右边的一个,由系统本身管着所有的连接。程序本身不知道任何关于连接的事情;对它们而言,它们只是在与终端对话。”

他说的是给普通用户以编程的能力。

POSIX 操作系统本身就像是一个 API。如果你能弄清楚如何在 POSIX 的 shell 中完成一个任务,那么你可以自动化这个任务。这就是编程,这种日常 POSIX 编程方法的主要方式就是 shell 脚本。

像它的名字那样,shell 脚本就是一行一行你想让你的计算机执行的语句,就像你手动的一样。

因为 shell 脚本包含常见的日常命令,所以熟悉 UNIX 或 Linux(通常称为 POSIX 系统)对 shell 是有帮助的。你使用 shell 的经验越多,就越容易编写新的脚本。这就像学习外语:你心里的词汇越多,组织复杂的句子就越容易。

当您打开终端窗口时,就是打开了 shell 。shell 有好几种,本教程适用于 bashtcshkshzsh 和其它几个。在下面几个部分,我提供一些 bash 特定的例子,但最终的脚本不会用那些,所以你可以切换到 bash 中学习设置变量的课程,或做一些简单的语法调整

如果你是新手,只需使用 bash 。它是一个很好的 shell,有许多友好的功能,它是 Linux、Cygwin、WSL、Mac 默认的 shell,并且在 BSD 上也支持。

Hello world

您可以从终端窗口生成您自己的 hello world 脚本 。注意你的引号;单和双都会有不同的效果(LCTT 译注:想必你不会在这里使用中文引号吧)。

$ echo "#\!/bin/sh" > hello.sh
$ echo "echo 'hello world' " >> hello.sh

正如你所看到的,编写 shell 脚本就是这样,除了第一行之外,就是把命令“回显”或粘贴到文本文件中而已。

像应用程序一样运行脚本:

$ chmod +x hello.sh
$ ./hello.sh
hello world

不管多少,这就是一个 shell 脚本了。

现在让我们处理一些有用的东西。

去除空格

如果有一件事情会干扰计算机和人类的交互,那就是文件名中的空格。您在互联网上看到过:http://example.com/omg%2ccutest%20cat%20photophoto%21%211.jpg 等网址。或者,当你不管不顾地运行一个简单的命令时,文件名中的空格会让你掉到坑里:

$ cp llama pic.jpg ~/photos
cp: cannot stat 'llama': No such file or directory
cp: cannot stat 'pic.jpg': No such file or directory

解决方案是用反斜杠来“转义”空格,或使用引号:

$ touch foo\ bar.txt
$ ls "foo bar.txt"
foo bar.txt

这些都是要知道的重要的技巧,但是它并不方便,为什么不写一个脚本从文件名中删除这些烦人的空格?

创建一个文件来保存脚本,以 释伴 shebang #!) 开头,让系统知道文件应该在 shell 中运行:

$ echo '#!/bin/sh' > despace

好的代码要从文档开始。定义好目的让我们知道要做什么。这里有一个很好的 README:

despace is a shell script for removing spaces from file names.

Usage:
$ despace "foo bar.txt"

现在让我们弄明白如何手动做,并且如何去构建脚本。

假设你有个只有一个 foo bar.txt 文件的目录,比如:

$ ls
hello.sh
foo bar.txt

计算机无非就是输入和输出而已。在这种情况下,输入是 ls 特定目录的请求。输出是您所期望的结果:该目录文件的名称。

在 UNIX 中,可以通过“管道”将输出作为另一个命令的输入,无论在管道的另一侧是什么过滤器。 tr 程序恰好设计为专门修改传输给它的字符串;对于这个例子,可以使用 --delete 选项删除引号中定义的字符。

$ ls "foo bar.txt" | tr --delete ' '
foobar.txt

现在你得到了所需的输出了。

在 Bash shell 中,您可以将输出存储为变量 。变量可以视为将信息存储到其中的空位:

$ NAME=foo

当您需要返回信息时,可以通过在变量名称前面缀上美元符号($ )来引用该位置。

$ echo $NAME
foo

要获得您的这个去除空格后的输出并将其放在一边供以后使用,请使用一个变量。将命令的结果放入变量,使用反引号(`)来完成:

$ NAME=`ls "foo bar.txt" | tr -d ' '`
$ echo $NAME
foobar.txt

我们完成了一半的目标,现在可以从源文件名确定目标文件名了。

到目前为止,脚本看起来像这样:

#!/bin/sh

NAME=`ls "foo bar.txt" | tr -d ' '`
echo $NAME

第二部分必须执行重命名操作。现在你可能已经知道这个命令:

$ mv "foo bar.txt" foobar.txt

但是,请记住在脚本中,您正在使用一个变量来保存目标名称。你已经知道如何引用变量:

#!/bin/sh

NAME=`ls "foo bar.txt" | tr -d ' '`
echo $NAME
mv "foo bar.txt" $NAME

您可以将其标记为可执行文件并在测试目录中运行它。确保您有一个名为 foo bar.txt(或您在脚本中使用的其它名字)的测试文件。

$ touch "foo bar.txt"
$ chmod +x despace
$ ./despace
foobar.txt
$ ls
foobar.txt

去除空格 v2.0

脚本可以正常工作,但不完全如您的文档所述。它目前非常具体,只适用于一个名为 foo\ bar.txt 的文件,其它都不适用。

POSIX 命令会将其命令自身称为 $0,并将其后键入的任何内容依次命名为 $1$2$3 等。您的 shell 脚本作为 POSIX 命令也可以这样计数,因此请尝试用 $1 来替换 foo\ bar.txt

#!/bin/sh

NAME=`ls $1 | tr -d ' '`
echo $NAME
mv $1 $NAME

创建几个新的测试文件,在名称中包含空格:

$ touch "one two.txt"
$ touch "cat dog.txt"

然后测试你的新脚本:

$ ./despace "one two.txt"
ls: cannot access 'one': No such file or directory
ls: cannot access 'two.txt': No such file or directory

看起来您发现了一个 bug!

这实际上不是一个 bug,一切都按设计工作,但不是你想要的。你的脚本将 $1 变量真真切切地 “扩展” 成了:“one two.txt”,捣乱的就是你试图消除的那个麻烦的空格。

解决办法是将变量用以引号封装文件名的方式封装变量:

#!/bin/sh

NAME=`ls "$1" | tr -d ' '`
echo $NAME
mv "$1" $NAME

再做个测试:

$ ./despace "one two.txt"
onetwo.txt
$ ./despace c*g.txt
catdog.txt

此脚本的行为与任何其它 POSIX 命令相同。您可以将其与其他命令结合使用,就像您希望的使用的任何 POSIX 程序一样。您可以将其与命令结合使用:

$ find ~/test0 -type f -exec /path/to/despace {} \;

或者你可以使用它作为循环的一部分:

$ for FILE in ~/test1/* ; do /path/to/despace $FILE ; done

等等。

去除空格 v2.5

这个去除脚本已经可以发挥功用了,但在技术上它可以优化,它可以做一些可用性改进。

首先,变量实际上并不需要。 shell 可以一次计算所需的信息。

POSIX shell 有一个操作顺序。在数学中使用同样的方式来首先处理括号中的语句,shell 在执行命令之前会先解析反引号 ` 或 Bash 中的 $() 。因此,下列语句:

$ mv foo\ bar.txt `ls foo\ bar.txt | tr -d ' '`

会变换成:

$ mv foo\ bar.txt foobar.txt

然后实际的 mv 命令执行,就得到了 foobar.txt 文件。

知道这一点,你可以将该 shell 脚本压缩成:

#!/bin/sh

mv "$1" `ls "$1" | tr -d ' '`

这看起来简单的令人失望。你可能认为它使脚本减少为一个单行并没有必要,但没有几行的 shell 脚本是有意义的。即使一个用简单的命令写的紧缩的脚本仍然可以防止你发生致命的打字错误,这在涉及移动文件时尤其重要。

此外,你的脚本仍然可以改进。更多的测试发现了一些弱点。例如,运行没有参数的 despace 会产生一个没有意义的错误:

$ ./despace
ls: cannot access '': No such file or directory

mv: missing destination file operand after ''
Try 'mv --help' for more information.

这些错误是让人迷惑的,因为它们是针对 lsmv 发出的,但就用户所知,它运行的不是 lsmv,而是 despace

如果你想一想,如果它没有得到一个文件作为命令的一部分,这个小脚本甚至不应该尝试去重命名文件,请尝试使用你知道的变量以及 test 功能来解决。

if 和 test

if 语句将把你的小 despace 实用程序从脚本蜕变成程序。这里面涉及到代码领域,但不要担心,它也很容易理解和使用。

if 语句是一种开关;如果某件事情是真的,那么你会做一件事,如果它是假的,你会做不同的事情。这个 if-then 指令的二分决策正好是计算机是擅长的;你需要做的就是为计算机定义什么是真或假以及并最终执行什么。

测试真或假的最简单的方法是 test 实用程序。你不用直接调用它,使用它的语法即可。在终端试试:

$ if [ 1 == 1 ]; then echo "yes, true, affirmative"; fi
yes, true, affirmative
$ if [ 1 == 123 ]; then echo "yes, true, affirmative"; fi
$

这就是 test 的工作方式。你有各种方式的简写可供选择,这里使用的是 -z 选项,它检测字符串的长度是否为零(0)。将这个想法翻译到你的 despace 脚本中就是:

#!/bin/sh

if [ -z "$1" ]; then
   echo "Provide a \"file name\", using quotes to nullify the space."
   exit 1
fi

mv "$1" `ls "$1" | tr -d ' '`

为了提高可读性,if 语句被放到单独的行,但是其概念仍然是:如果 $1 变量中的数据为空(零个字符存在),则打印一个错误语句。

尝试一下:

$ ./despace
Provide a "file name", using quotes to nullify the space.
$

成功!

好吧,其实这是一个失败,但它是一个漂亮的失败,更重要的是,一个有意义的失败。

注意语句 exit 1 。这是 POSIX 应用程序遇到错误时向系统发送警报的一种方法。这个功能对于需要在脚本中使用 despace ,并依赖于它成功执行才能顺利运行的你或其它人来说很重要。

最后的改进是添加一些东西,以保护用户不会意外覆盖文件。理想情况下,您可以将此选项传递给脚本,所以它是可选的;但为了简单起见,这里对其进行了硬编码。 -i 选项告诉 mv 在覆盖已存在的文件之前请求许可:

#!/bin/sh

if [ -z "$1" ]; then
   echo "Provide a \"file name\", using quotes to nullify the space."
   exit 1
fi

mv -i "$1" `ls "$1" | tr -d ' '`

现在你的 shell 脚本是有意义的、有用的、友好的 - 你是一个程序员了,所以不要停。学习新命令,在终端中使用它们,记下您的操作,然后编写脚本。最终,你会把自己从工作中解脱出来,当你的机器仆人运行 shell 脚本,接下来的生活将会轻松。

Happy hacking!


作者简介:

Seth Kenlon 是一位独立的多媒体艺术家,自由文化倡导者和 UNIX 极客。他是基于 Slackware 的多媒体制作项目(http://slackermedia.ml)的维护者之一


via: https://opensource.com/article/17/1/getting-started-shell-scripting

作者:Seth Kenlon 译者:hkurj 校对:wxy

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