分类 技术 下的文章

掌握这些 Google Chrome 键盘快捷键,以获得更好、更流畅、更高效的 Web 浏览体验。还包括可下载的备忘单。

无可否认,Google Chrome 是最受欢迎的网络浏览器。它的开源版本 Chromium 也越来越受欢迎,现在一些 Linux 发行版将其作为默认的网络浏览器。

如果你经常在台式机上使用它,则可以使用 Google Chrome 键盘快捷键来改善浏览体验。没有必要用你的鼠标移来移去、点来点去。只要掌握这些快捷方式,你可以节省一些时间并提高工作效率。

我这里使用的名称是 Google Chrome,但是这些快捷方式同样适用于 Chromium 浏览器。

你应该使用的 11 个酷炫的 Chrome 键盘快捷键

如果你是专业人士,可能已经知道其中一些 Chrome 快捷方式,但是有可能你仍然可以在这里找到一些隐藏的宝石。让我们来看看。

键盘快捷键动作
Ctrl+T打开一个新标签页
Ctrl+N打开一个新窗口
Ctrl+Shift+N打开一个新无痕式窗口
Ctrl+W关闭当前标签页
Ctrl+Shift+T重新打开上一个关闭的标签页
Ctrl+Shift+W关闭窗口
Ctrl+TabCtrl+Shift+Tab切换到右侧或左侧的标签页
Ctrl+L访问搜索/地址栏
Ctrl+D将网址放入书签
Ctrl+H访问浏览历史
Ctrl+J访问下载历史
Shift+Esc打开 Chrome 任务管理器

你可以下载这份有用的 Chrome 键盘快捷键列表来作为快速参考

1、用 Ctrl+T 打开一个新标签页

需要打开一个新标签页吗?只需同时按 CtrlT 键,你就会打开一个新标签。

2、使用 Ctrl+N 打开一个新窗口

已经打开太多标签页?是时候打开一个新的窗口。使用 CtrlN 键打开一个新的浏览器窗口。

3、使用 Ctrl+Shift+N 隐身

在线查询航班或酒店价格?隐身可能会有所帮助。使用 Ctrl+Shift+N 在 Chrome 中打开一个隐身窗口。

4、使用 Ctrl+W 关闭标签页

使用 CtrlW 键关闭当前标签页。无需将鼠标移到顶部并寻找 x 按钮。

5、不小心关闭了标签页?用 Ctrl+Shift+T 重新打开

这是我最喜欢的 Google Chrome 浏览器快捷方式。当你关闭了原本不想关的标签页时,就不用再懊悔了。使用 Ctrl+Shift+T,它将打开最后一个关闭的选项卡。继续按此组合键,它把关闭的选项卡再次打开。

6、使用 Ctrl+Shift+W 关闭整个浏览器窗口

完成工作了吗?是时候关闭带有所有标签页的整个浏览器窗口了。使用 Ctrl+Shift+W 键,浏览器窗口将消失,就像以前不存在一样。

7、使用 Ctrl+Tab 在标签之间切换

打开的标签页太多了吗?你可以使用 Ctrl+Tab 移至右侧标签页。想左移吗?使用 Ctrl+Shift+Tab。重复按这些键,你可以在当前浏览器窗口的所有打开的标签页之间移动。

你也可以使用 Ctrl+0 直到 Ctrl+9 转到前 10 个标签页之一。但是此 Chrome 键盘快捷键不适用于第 11 个及更多标签页。

8、使用 Ctrl+L 转到搜索/地址栏

想要输入新的 URL 或快速搜索一些内容。你可以使用 Ctrl+L,它将在顶部突出显示地址栏。

9、用 Ctrl+D 收藏当前网站

找到了有趣的东西?使用 Ctrl+D 组合键将其保存在书签中。

10、使用 Ctrl+H 返回历史记录

你可以使用 Ctrl+H 键打开浏览器历史记录。如果你正在寻找前一段时间访问过的页面,或者删除你不想再看到的页面,可以搜索历史记录。

11、使用 Ctrl+J 查看下载

在 Chrome 中按 Ctrl+J 键将带你进入下载页面。此页面将显示你执行的所有下载操作。

意外惊喜:使用 Shift+Esc 打开 Chrome 任务管理器

很多人甚至都不知道 Chrome 浏览器中有一个任务管理器。Chrome 以消耗系统内存而臭名昭著。而且,当你打开大量标签时,找到罪魁祸首并不容易。

使用 Chrome 任务管理器,你可以查看所有打开的标签页及其系统利用率统计信息。你还可以看到各种隐藏的进程,例如 Chrome 扩展程序和其他服务。

Google Chrome 任务管理器

下载 Chrome 快捷键备忘单

我知道掌握键盘快捷键取决于习惯,你可以通过反复使用使其习惯。为了帮助你完成此任务,我创建了此 Google Chrome 键盘快捷键备忘单。

Google Chrome 键盘快捷键备忘单

你可以下载以下 PDF 格式的图像,进行打印并将其放在办公桌上。这样,你可以一直练习快捷方式。

如果你对掌握快捷方式感兴趣,还可以查看 Ubuntu 键盘快捷键

顺便问一下,你最喜欢的 Chrome 快捷方式是什么?


via: https://itsfoss.com/google-chrome-shortcuts/

作者:Abhishek Prakash 选题:lujun9972 译者:wxy 校对:wxy

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

知道如何控制用户对文件的访问是一项基本的系统管理技能。

了解 Linux 权限以及如何控制哪些用户可以访问文件是系统管理的一项基本技能。

本文将介绍标准 Linux 文件系统权限,并进一步研究特殊权限,以及使用 umask 来解释默认权限作为文章的结束。

理解 ls 命令的输出

在讨论如何修改权限之前,我们需要知道如何查看权限。通过 ls 命令的长列表参数(-l)为我们提供了有关文件的许多信息。

$ ls -lAh
total 20K
-rwxr-xr--+ 1 root root    0 Mar  4 19:39 file1
-rw-rw-rw-. 1 root root    0 Mar  4 19:39 file10
-rwxrwxr--+ 1 root root    0 Mar  4 19:39 file2
-rw-rw-rw-. 1 root root    0 Mar  4 19:39 file8
-rw-rw-rw-. 1 root root    0 Mar  4 19:39 file9
drwxrwxrwx. 2 root root 4.0K Mar  4 20:04 testdir

为了理解这些是什么意思,让我们将关于权限的输出分解为各个部分。单独理解每个部分会更容易。

让我们看看在上面的输出中的最后一行的每个组件:

drwxrwxrwx. 2 root root 4.0K Mar  4 20:04 testdir
第 1 节第 2 节第 3 节第 4 节第 5 节第 6 节第 7 节
drwxrwxrwx.rootroot

第 1 节(左侧)显示文件的类型。

符号类型
d目录
-常规文件
l软链接

lsinfo 页面完整列出了不同的文件类型。

每个文件都有三种访问方式:

  • 属主
  • 所有其他人 第 2、3 和 4 节涉及用户(属主)、组和“其他用户”权限。每个部分都可以包含 r(读取)、w(写入)和 x(执行)权限的组合。

每个权限还分配了一个数值,这在以八进制表示形式讨论权限时很重要。

权限八进制值
r4
w2
x1

第 5 节描述了其他替代访问方法,例如 SELinux 或文件访问控制列表(FACL)。

访问方法字符
没有其它访问方法-
SELinux.
FACL+
各种方法的组合+

第 6 节和第 7 节分别是属主和组的名称。

使用 chown 和 chmod

chown 命令

chown(更改所有权)命令用于更改文件的用户和组的所有权。

要将文件 foo 的用户和组的所有权更改为 root,我们可以使用以下命令:

$ chown root:root foo
$ chown root: foo

在用户名后跟冒号(:)运行该命令将同时设置用户和组所有权。

要仅将文件 foo 的用户所有权设置为 root 用户,请输入:

$ chown root foo

要仅更改文件 foo 的组所有权,请在组之前加冒号:

$ chown :root foo

chmod 命令

chmod(更改模式)命令控制属主、组以及既不是属主也不属于与文件关联的组的所有其他用户的文件许可权。

chmod 命令可以以八进制(例如 755644 等)和符号(例如 u+rwxg-rwxo=rw)格式设置权限。

八进制表示法将 4 个“点”分配给“读取”,将 2 个“点”分配给“写入”,将 1 个点分配给“执行”。如果要给用户(属主)分配“读取”权限,则将 4 分配给第一个插槽,但是如果要添加“写入”权限,则必须添加 2。如果要添加“执行”,则要添加 1。我们对每种权限类型执行此操作:属主、组和其他。

例如,如果我们想将“读取”、“写入”和“执行”分配给文件的属主,但仅将“读取”和“执行”分配给组成员和所有其他用户,则我们应使用 755(八进制格式)。这是属主的所有权限位(4+2+1),但组和其他权限的所有权限位只有 414+1)。

细分为:4+2+1=7,4+1=5 和 4+1=5。

如果我们想将“读取”和“写入”分配给文件的属主,而只将“读取”分配给组的成员和所有其他用户,则可以如下使用 chmod

$ chmod 644 foo_file

在下面的示例中,我们在不同的分组中使用符号表示法。注意字母 ugo 分别代表“用户”(属主)、“组”和“其他”。我们将 ugo+-= 结合使用来添加、删除或设置权限位。

要将“执行”位添加到所有权权限集中:

$ chmod u+x foo_file

要从组成员中删除“读取”、“写入”和“执行”:

$ chmod g-rwx foo_file

要将所有其他用户的所有权设置为“读取”和“写入”:

$ chmod o=rw

特殊位:设置 UID、设置 GID 和粘滞位

除了标准权限外,还有一些特殊的权限位,它们具有一些别的用处。

设置用户 ID(suid)

当在文件上设置 suid 时,将以文件的属主的身份而不是运行该文件的用户身份执行操作。一个好的例子passwd 命令。它需要设置 suid 位,以便更改密码的操作具有 root 权限。

$ ls -l /bin/passwd
-rwsr-xr-x. 1 root root 27832 Jun 10  2014 /bin/passwd

设置 suid 位的示例:

$ chmod u+s /bin/foo_file_name

设置组 ID(sgid)

sgid 位与 suid 位类似,操作是在目录的组所有权下完成的,而不是以运行命令的用户身份。

一个使用 sgid 的例子是,如果多个用户正在同一个目录中工作,并且目录中创建的每个文件都需要具有相同的组权限。下面的示例创建一个名为 collab_dir 的目录,设置 sgid 位,并将组所有权更改为 webdev

$ mkdir collab_dir
$ chmod g+s collab_dir
$ chown :webdev collab_dir

现在,在该目录中创建的任何文件都将具有 webdev 的组所有权,而不是创建该文件的用户的组。

$ cd collab_dir
$ touch file-sgid
$ ls -lah file-sgid
-rw-r--r--. 1 root webdev 0 Jun 12 06:04 file-sgid

“粘滞”位

粘滞位表示,只有文件所有者才能删除该文件,即使组权限允许该文件可以删除。通常,在 /tmp 这样的通用或协作目录上,此设置最有意义。在下面的示例中,“所有其他人”权限集的“执行”列中的 t 表示已应用粘滞位。

$ ls -ld /tmp
drwxrwxrwt. 8 root root 4096 Jun 12 06:07 /tmp/

请记住,这不会阻止某个人编辑该文件,它只是阻止他们删除该目录的内容(LCTT 译注:即删除目录下文件)。

我们将粘滞位设置为:

$ chmod o+t foo_dir

你可以自己尝试在目录上设置粘滞位并赋予其完整的组权限,以便多个属于同一组的用户可以在目录上进行读取、写入和执行。

接着,以每个用户的身份创建文件,然后尝试以另一个用户的身份删除它们。

如果一切配置正确,则一个用户应该不能从另一用户那里删除文件。

请注意,这些位中的每个位也可以用八进制格式设置:SUID = 4、SGID = 2 和 粘滞位 = 1。(LCTT 译注:这里是四位八进制数字)

$ chmod 4744
$ chmod 2644
$ chmod 1755

大写还是小写?

如果要设置特殊位时看到大写的 ST 而不是小写的字符(如我们之前所见),那是因为不存在(对应的)底层的执行位。为了说明这一点,下面的示例创建一个设置了粘滞位的文件。然后,我们可以添加和删除执行位以演示大小写更改。

$ touch file cap-ST-demo
$ chmod 1755 cap-ST-demo
$ ls -l cap-ST-demo
-rwxr-xr-t. 1 root root 0 Jun 12 06:16 cap-ST-demo

$ chmod o-x cap-X-demo
$ ls -l cap-X-demo
-rwxr-xr-T. 1 root root 0 Jun 12 06:16 cap-ST-demo

有条件地设置执行位

至此,我们使用小写的 x 设置了执行位,而无需询问任何问题即可对其进行设置。我们还有另一种选择:使用大写的 X 而不是小写的,它将仅在权限组中某个位置已经有执行位时才设置执行位。这可能是一个很难解释的概念,但是下面的演示将帮助说明它。请注意,在尝试将执行位添加到组特权之后,该位没有被设置上。

$ touch cap-X-file
$ ls -l cap-X-file
-rw-r--r--. 1 root root 0 Jun 12 06:31 cap-X-file
$ chmod g+X cap-X-file
$ ls -l cap-X-file
-rw-r--r--. 1 root root 0 Jun 12 06:31 cap-X-file

在这个类似的例子中,我们首先使用小写的 x 将执行位添加到组权限,然后使用大写的 X 为所有其他用户添加权限。这次,大写的 X设置了该权限。

$ touch cap-X-file
$ ls -l cap-X-file
-rw-r--r--. 1 root root 0 Jun 12 06:31 cap-X-file
$ chmod g+x cap-X-file
$ ls -l cap-X-file
-rw-r-xr--. 1 root root 0 Jun 12 06:31 cap-X-file
$ chmod o+X cap-X-file
ls -l cap-X-file
-rw-r-xr-x. 1 root root 0 Jun 12 06:31 cap-X-file

理解 umask

umask 会屏蔽(或“阻止”)默认权限集中的位,以定义文件或目录的权限。例如,umask输出中的 2 表示它至少在默认情况下阻止了文件的“写入”位。

使用不带任何参数的 umask 命令可以使我们看到当前的 umask 设置。共有四列:第一列为特殊的suidsgid 或粘滞位而保留,其余三列代表属主、组和其他人的权限。

$ umask
0022

为了理解这意味着什么,我们可以用 -S 标志来执行 umask(如下所示)以解释屏蔽位的结果。例如,由于第三列中的值为 2,因此将“写入”位从组和其他部分中屏蔽掉了;只能为它们分配“读取”和“执行”。

$ umask -S
u=rwx,g=rx,o=rx

要查看文件和目录的默认权限集是什么,让我们将 umask 设置为全零。这意味着我们在创建文件时不会掩盖任何位。

$ umask 000
$ umask -S
u=rwx,g=rwx,o=rwx

$ touch file-umask-000
$ ls -l file-umask-000
-rw-rw-rw-. 1 root root 0 Jul 17 22:03 file-umask-000

现在,当我们创建文件时,我们看到所有部分的默认权限分别为“读取”(4)和“写入”(2),相当于八进制表示 666

我们可以对目录执行相同的操作,并看到其默认权限为 777。我们需要在目录上使用“执行”位,以便可以遍历它们。

$ mkdir dir-umask-000
$ ls -ld dir-umask-000
drwxrwxrwx. 2 root root 4096 Jul 17 22:03 dir-umask-000/

总结

管理员还有许多其他方法可以控制对系统文件的访问。这些权限是 Linux 的基本权限,我们可以在这些基础上进行构建。如果你的工作为你引入了 FACL 或 SELinux,你会发现它们也建立在这些文件访问的首要规则之上。


via: https://opensource.com/article/19/8/linux-permissions-101

作者:Alex Juarez 选题:lujun9972 译者:wxy 校对:wxy

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

让我们通过本系列文章来学习基本的 Bash 编程语法和工具,以及如何使用变量和控制运算符,这是三篇中的第一篇。

Shell 是操作系统的命令解释器,其中 Bash 是我最喜欢的。每当用户或者系统管理员将命令输入系统的时候,Linux 的 shell 解释器就会把这些命令转换成操作系统可以理解的形式。而执行结果返回 shell 程序后,它会将结果输出到 STDOUT(标准输出),默认情况下,这些结果会显示在你的终端。所有我熟悉的 shell 同时也是一门编程语言。

Bash 是个功能强大的 shell,包含众多便捷特性,比如:tab 补全、命令回溯和再编辑、别名等。它的命令行默认编辑模式是 Emacs,但是我最喜欢的 Bash 特性之一是我可以将其更改为 Vi 模式,以使用那些储存在我肌肉记忆中的的编辑命令。

然而,如果你把 Bash 当作单纯的 shell 来用,则无法体验它的真实能力。我在设计一套包含三卷的 Linux 自学课程时(这个系列的文章正是基于此课程),了解到许多 Bash 的知识,这些是我在过去 20 年的 Linux 工作经验中所没有掌握的,其中的一些知识就是关于 Bash 的编程用法。不得不说,Bash 是一门强大的编程语言,是一个能够同时用于命令行和 shell 脚本的完美设计。

本系列文章将要探讨如何使用 Bash 作为命令行界面(CLI)编程语言。第一篇文章简单介绍 Bash 命令行编程、变量以及控制运算符。其他文章会讨论诸如:Bash 文件的类型;字符串、数字和一些逻辑运算符,它们能够提供代码执行流程中的逻辑控制;不同类型的 shell 扩展;通过 forwhileuntil 来控制循环操作。

Shell

Bash 是 Bourne Again Shell 的缩写,因为 Bash shell 是 基于 更早的 Bourne shell,后者是 Steven Bourne 在 1977 年开发的。另外还有很多其他的 shell 可以使用,但下面四个是我经常见到的:

  • csh:C shell 适合那些习惯了 C 语言语法的开发者。
  • ksh:Korn shell,由 David Korn 开发,在 Unix 用户中更流行。
  • tcsh:一个 csh 的变种,增加了一些易用性。
  • zsh:Z shell,集成了许多其他流行 shell 的特性。

所有 shell 都有内置命令,用以补充或替代核心工具集。打开 shell 的 man 说明页,找到“BUILT-INS”那一段,可以查看都有哪些内置命令。

每种 shell 都有它自己的特性和语法风格。我用过 csh、ksh 和 zsh,但我还是更喜欢 Bash。你可以多试几个,寻找更适合你的 shell,尽管这可能需要花些功夫。但幸运的是,切换不同 shell 很简单。

所有这些 shell 既是编程语言又是命令解释器。下面我们来快速浏览一下 Bash 中集成的编程结构和工具。

作为编程语言的 Bash

大多数场景下,系统管理员都会使用 Bash 来发送简单明了的命令。但 Bash 不仅可以输入单条命令,很多系统管理员可以编写简单的命令行程序来执行一系列任务,这些程序可以作为通用工具,能节省时间和精力。

编写 CLI 程序的目的是要提高效率(做一个“懒惰的”系统管理员)。在 CLI 程序中,你可以用特定顺序列出若干命令,逐条执行。这样你就不用盯着显示屏,等待一条命令执行完,再输入另一条,省下来的时间就可以去做其他事情了。

什么是“程序”?

自由在线计算机词典(FOLDOC)对于程序的定义是:“由计算机执行的指令,而不是运行它们的物理硬件。”普林斯顿大学的 WordNet 将程序定义为:“……计算机可以理解并执行的一系列指令……”维基百科上也有一条不错的关于计算机程序的条目。

总结下,程序由一条或多条指令组成,目的是完成一个具体的相关任务。对于系统管理员而言,一段程序通常由一系列的 shell 命令构成。Linux 下所有的 shell (至少我所熟知的)都有基本的编程功能,Bash 作为大多数 linux 发行版的默认 shell,也不例外。

本系列用 Bash 举例(因为它无处不在),假如你使用一个不同的 shell 也没关系,尽管结构和语法有所不同,但编程思想是相通的。有些 shell 支持某种特性而其他 shell 则不支持,但它们都提供编程功能。Shell 程序可以被存在一个文件中被反复使用,或者在需要的时候才创建它们。

简单 CLI 程序

最简单的命令行程序只有一或两条语句,它们可能相关,也可能无关,在按回车键之前被输入到命令行。程序中的第二条语句(如果有的话)可能取决于第一条语句的操作,但也不是必须的。

这里需要特别讲解一个标点符号。当你在命令行输入一条命令,按下回车键的时候,其实在命令的末尾有一个隐含的分号(;)。当一段 CLI shell 程序在命令行中被串起来作为单行指令使用时,必须使用分号来终结每个语句并将其与下一条语句分开。但 CLI shell 程序中的最后一条语句可以使用显式或隐式的分号。

一些基本语法

下面的例子会阐明这一语法规则。这段程序由单条命令组成,还有一个显式的终止符:

[student@studentvm1 ~]$ echo "Hello world." ;
Hello world.

看起来不像一个程序,但它确是我学习每个新编程语言时写下的第一个程序。不同语言可能语法不同,但输出结果是一样的。

让我们扩展一下这段微不足道却又无所不在的代码。你的结果可能与我的有所不同,因为我的家目录有点乱,而你可能是在 GUI 桌面中第一次登录账号。

[student@studentvm1 ~]$ echo "My home directory." ; ls ;
My home directory.
chapter25   TestFile1.Linux  dmesg2.txt  Downloads  newfile.txt  softlink1  testdir6
chapter26   TestFile1.mac    dmesg3.txt  file005    Pictures     Templates  testdir
TestFile1      Desktop       dmesg.txt   link3      Public       testdir    Videos
TestFile1.dos  dmesg1.txt    Documents   Music      random.txt   testdir1

现在是不是更明显了。结果是相关的,但是两条语句彼此独立。你可能注意到我喜欢在分号前后多输入一个空格,这样会让代码的可读性更好。让我们再运行一遍这段程序,这次不要带结尾的分号:

[student@studentvm1 ~]$ echo "My home directory." ; ls

输出结果没有区别。

关于变量

像所有其他编程语言一样,Bash 支持变量。变量是个象征性的名字,它指向内存中的某个位置,那里存着对应的值。变量的值是可以改变的,所以它叫“变~量”。

Bash 不像 C 之类的语言,需要强制指定变量类型,比如:整型、浮点型或字符型。在 Bash 中,所有变量都是字符串。整数型的变量可以被用于整数运算,这是 Bash 唯一能够处理的数学类型。更复杂的运算则需要借助 bc 这样的命令,可以被用在命令行编程或者脚本中。

变量的值是被预先分配好的,这些值可以用在命令行编程或者脚本中。可以通过变量名字给其赋值,但是不能使用 $ 符开头。比如,VAR=10 这样会把 VAR 的值设为 10。要打印变量的值,你可以使用语句 echo $VAR。变量名必须以文本(即非数字)开始。

Bash 会保存已经定义好的变量,直到它们被取消掉。

下面这个例子,在变量被赋值前,它的值是空(null)。然后给它赋值并打印出来,检验一下。你可以在同一行 CLI 程序里完成它:

[student@studentvm1 ~]$ echo $MyVar ; MyVar="Hello World" ; echo $MyVar ;

Hello World
[student@studentvm1 ~]$

注意:变量赋值的语法非常严格,等号(=)两边不能有空格。

那个空行表明了 MyVar 的初始值为空。变量的赋值和改值方法都一样,这个例子展示了原始值和新的值。

正如之前说的,Bash 支持整数运算,当你想计算一个数组中的某个元素的位置,或者做些简单的算术运算,这还是挺有帮助的。然而,这种方法并不适合科学计算,或是某些需要小数运算的场景,比如财务统计。这些场景有其它更好的工具可以应对。

下面是个简单的算术题:

[student@studentvm1 ~]$ Var1="7" ; Var2="9" ; echo "Result = $((Var1*Var2))"
Result = 63

好像没啥问题,但如果运算结果是浮点数会发生什么呢?

[student@studentvm1 ~]$ Var1="7" ; Var2="9" ; echo "Result = $((Var1/Var2))"
Result = 0
[student@studentvm1 ~]$ Var1="7" ; Var2="9" ; echo "Result = $((Var2/Var1))"
Result = 1
[student@studentvm1 ~]$

结果会被取整。请注意运算被包含在 echo 语句之中,其实计算在 echo 命令结束前就已经完成了,原因是 Bash 的内部优先级。想要了解详情的话,可以在 Bash 的 man 页面中搜索 “precedence”。

控制运算符

Shell 的控制运算符是一种语法运算符,可以轻松地创建一些有趣的命令行程序。在命令行上按顺序将几个命令串在一起,就变成了最简单的 CLI 程序:

command1 ; command2 ; command3 ; command4 ; . . . ; etc. ;

只要不出错,这些命令都能顺利执行。但假如出错了怎么办?你可以预设好应对出错的办法,这就要用到 Bash 内置的控制运算符, &&||。这两种运算符提供了流程控制功能,使你能改变代码执行的顺序。分号也可以被看做是一种 Bash 运算符,预示着新一行的开始。

&& 运算符提供了如下简单逻辑,“如果 command1 执行成功,那么接着执行 command2。如果 command1 失败,就跳过 command2。”语法如下:

command1 && command2

现在,让我们用命令来创建一个新的目录,如果成功的话,就把它切换为当前目录。确保你的家目录(~)是当前目录,先尝试在 /root 目录下创建,你应该没有权限:

[student@studentvm1 ~]$ Dir=/root/testdir ; mkdir $Dir/ && cd $Dir
mkdir: cannot create directory '/root/testdir/': Permission denied
[student@studentvm1 ~]$

上面的报错信息是由 mkdir 命令抛出的,因为创建目录失败了。&& 运算符收到了非零的返回码,所以 cd 命令就被跳过,前者阻止后者继续运行,因为创建目录失败了。这种控制流程可以阻止后面的错误累积,避免引发更严重的问题。是时候讲点更复杂的逻辑了。

当一段程序的返回码大于零时,使用 || 运算符可以让你在后面接着执行另一段程序。简单语法如下:

command1 || command2

解读一下,“假如 command1 失败,执行 command2”。隐藏的逻辑是,如果 command1 成功,跳过 command2。下面实践一下,仍然是创建新目录:

[student@studentvm1 ~]$ Dir=/root/testdir ; mkdir $Dir || echo "$Dir was not created."
mkdir: cannot create directory '/root/testdir': Permission denied
/root/testdir was not created.
[student@studentvm1 ~]$

正如预期,因为目录无法创建,第一条命令失败了,于是第二条命令被执行。

&&|| 两种运算符结合起来才能发挥它们的最大功效。请看下面例子中的流程控制方法:

前置 commands ; command1 && command2 || command3 ; 跟随 commands

语法解释:“假如 command1 退出时返回码为零,就执行 command2,否则执行 command3。”用具体代码试试:

[student@studentvm1 ~]$ Dir=/root/testdir ; mkdir $Dir && cd $Dir || echo "$Dir was not created."
mkdir: cannot create directory '/root/testdir': Permission denied
/root/testdir was not created.
[student@studentvm1 ~]$

现在我们再试一次,用你的家目录替换 /root 目录,你将会有权限创建这个目录了:

[student@studentvm1 ~]$ Dir=~/testdir ; mkdir $Dir && cd $Dir || echo "$Dir was not created."
[student@studentvm1 testdir]$

command1 && command2 这样的控制语句能够运行的原因是,每条命令执行完毕时都会给 shell 发送一个返回码,用来表示它执行成功与否。默认情况下,返回码为 0 表示成功,其他任何正值表示失败。一些系统管理员使用的工具用值为 1 的返回码来表示失败,但其他很多程序使用别的数字来表示失败。

Bash 的内置变量 $? 可以显示上一条命令的返回码,可以在脚本或者命令行中非常方便地检查它。要查看返回码,让我们从运行一条简单的命令开始,返回码的结果总是上一条命令给出的。

[student@studentvm1 testdir]$ ll ; echo "RC = $?"
total 1264
drwxrwxr-x  2 student student   4096 Mar  2 08:21 chapter25
drwxrwxr-x  2 student student   4096 Mar 21 15:27 chapter26
-rwxr-xr-x  1 student student     92 Mar 20 15:53 TestFile1
drwxrwxr-x. 2 student student 663552 Feb 21 14:12 testdir
drwxr-xr-x. 2 student student   4096 Dec 22 13:15 Videos
RC = 0
[student@studentvm1 testdir]$

在这个例子中,返回码为零,意味着命令执行成功了。现在对 root 的家目录测试一下,你应该没有权限:

[student@studentvm1 testdir]$ ll /root ; echo "RC = $?"
ls: cannot open directory '/root': Permission denied
RC = 2
[student@studentvm1 testdir]$

本例中返回码是 2,表明非 root 用户没有权限进入这个目录。你可以利用这些返回码,用控制运算符来改变程序执行的顺序。

总结

本文将 Bash 看作一门编程语言,并从这个视角介绍了它的简单语法和基础工具。我们学习了如何将数据输出到 STDOUT,怎样使用变量和控制运算符。在本系列的下一篇文章中,将会重点介绍能够控制指令执行流程的逻辑运算符。


via: https://opensource.com/article/19/10/programming-bash-part-1

作者:David Both 选题:lujun9972 译者:jdh8383 校对:wxy

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

本快速教程介绍了更新 Fedora Linux 安装的多种方法。

前几天,我安装了新发布的 Fedora 31。老实说,这是我第一次使用非 Ubuntu 发行版

安装 Fedora 之后,我做的第一件事就是尝试安装一些软件。我打开软件中心,发现该软件中心已“损坏”。 我无法从中安装任何应用程序。

我不确定我的系统出了什么问题。在团队内部讨论时,Abhishek 建议我先更新系统。我更新了,更新后一切恢复正常。更新 Fedora 系统后,软件中心也能正常工作了。

有时我们一直尝试解决我们所面临的问题,而忽略了对系统的更新。不管问题有多大或多小,为了避免它们,你都应该保持系统更新。

在本文中,我将向你展示更新 Fedora Linux 系统的多种方法。

  • 使用软件中心更新 Fedora
  • 使用命令行更新 Fedora
  • 从系统设置更新 Fedora

请记住,更新 Fedora 意味着安装安全补丁、更新内核和软件。如果要从 Fedora 的一个版本更新到另一个版本,这称为版本升级,你可以在此处阅读有关 Fedora 版本升级过程的信息

从软件中心更新 Fedora

软件中心

你很可能会收到通知,通知你有一些系统更新需要查看,你应该在单击该通知时启动软件中心。

你所要做的就是 —— 点击“更新”,并验证 root 密码开始更新。

如果你没有收到更新的通知,则只需启动软件中心并转到“更新”选项卡即可。现在,你只需要继续更新。

使用终端更新 Fedora

如果由于某种原因无法加载软件中心,则可以使用 dnf 软件包管理命令轻松地更新系统。

只需启动终端并输入以下命令即可开始更新(系统将提示你确认 root 密码):

sudo dnf upgrade

**dnf 更新 vs dnf 升级 **

你会发现有两个可用的 dnf 命令:dnf updatednf upgrade。这两个命令执行相同的工作,即安装 Fedora 提供的所有更新。那么,为什么要会有这两个呢,你应该使用哪一个?dnf update 基本上是 dnf upgrade 的别名。尽管 dnf update 可能仍然有效,但最好使用 dnf upgrade,因为这是真正的命令。

从系统设置中更新 Fedora

如果其它方法都不行(或者由于某种原因已经进入“系统设置”),请导航至“设置”底部的“详细信息”选项。

如上图所示,该选项中显示操作系统和硬件的详细信息以及一个“检查更新”按钮。你只需要单击它并提供 root 密码即可继续安装可用的更新。

总结

如上所述,更新 Fedora 系统非常容易。有三种方法供你选择,因此无需担心。

如果你按上述说明操作时发现任何问题,请随时在下面的评论部分告诉我。


via: https://itsfoss.com/update-fedora/

作者:Ankush Das 选题:lujun9972 译者:Morisun029 校对:wxy

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

Google Keyboard

操作鼠标、键盘和菜单会占用我们很多时间,这些可以使用键盘快捷键来节省时间。这不仅节省时间,还可以使用户更高效。

你是否意识到每次在打字时从键盘切换到鼠标需要多达两秒钟?如果一个人每天工作八小时,每分钟从键盘切换到鼠标一次,并且一年中大约有 240 个工作日,那么所浪费的时间(根据 Brainscape 的计算)为: [每分钟浪费 2 秒] x [每天 480 分钟] x 每年 240 个工作日 = 每年浪费 64 小时 这相当于损失了八个工作日,因此学习键盘快捷键将使生产率提高 3.3%(https://www.brainscape.com/blog/2011/08/keyboard-shortcuts-economy/)。

键盘快捷键提供了一种更快的方式来执行任务,不然就需要使用鼠标和/或菜单分多个步骤来完成。图 1 列出了 Ubuntu 18.04 Linux 和 Web 浏览器中一些最常用的快捷方式。我省略了非常有名的快捷方式,例如复制、粘贴等,以及不经常使用的快捷方式。读者可以参考在线资源以获得完整的快捷方式列表。请注意,Windows 键在 Linux 中被重命名为 Super 键。

常规快捷方式

下面列出了常规快捷方式。

打印屏幕和屏幕录像

以下快捷方式可用于打印屏幕或录制屏幕视频。

在应用之间切换

此处列出的快捷键可用于在应用之间切换。

平铺窗口

可以使用下面提供的快捷方式以不同方式将窗口平铺。

浏览器快捷方式

此处列出了浏览器最常用的快捷方式。大多数快捷键对于 Chrome/Firefox 浏览器是通用的。

组合键行为
Ctrl + T打开一个新标签。
Ctrl + Shift + T打开最近关闭的标签。
Ctrl + D添加一个新书签。
Ctrl + W关闭浏览器标签。
Alt + D将光标置于浏览器的地址栏中。
F5 或 Ctrl-R刷新页面。
Ctrl + Shift + Del清除私人数据和历史记录。
Ctrl + N打开一个新窗口。
Home滚动到页面顶部。
End滚动到页面底部。
Ctrl + J打开下载文件夹(在 Chrome 中)
F11全屏视图(切换效果)

终端快捷方式

这是终端快捷方式的列表。

你还可以在 Ubuntu 中配置自己的自定义快捷方式,如下所示:

  • 在 Ubuntu Dash 中单击设置。
  • 在“设置”窗口的左侧菜单中选择“设备”选项卡。
  • 在设备菜单中选择键盘标签。
  • 右面板的底部有个 “+” 按钮。点击 “+” 号打开自定义快捷方式对话框并配置新的快捷方式。

学习本文提到的三个快捷方式可以节省大量时间,并使你的工作效率更高。

引用

[Cohen, Andrew. How keyboard shortcuts could revive America’s economy; www.brainscape.com. [Online] Brainscape, 26 May 2017;](https://www.brainscape.com/blog/2011/08/keyboard-shortcuts-economy/)


via: https://opensourceforu.com/2019/11/keyboard-shortcuts-to-speed-up-your-work-in-linux/

作者:S Sathyanarayanan 选题:lujun9972 译者:geekpi 校对:wxy

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

通过这份 Jenkins 分步教程,构建持续集成和持续交付(CI/CD)流水线。

在我的文章《使用开源工具构建 DevOps 流水线的初学者指南》中,我分享了一个从头开始构建 DevOps 流水线的故事。推动该计划的核心技术是 Jenkins,这是一个用于建立持续集成和持续交付(CI/CD)流水线的开源工具。

在花旗,有一个单独的团队为专用的 Jenkins 流水线提供稳定的主从节点环境,但是该环境仅用于质量保证(QA)、构建阶段和生产环境。开发环境仍然是非常手动的,我们的团队需要对其进行自动化以在加快开发工作的同时获得尽可能多的灵活性。这就是我们决定为 DevOps 建立 CI/CD 流水线的原因。Jenkins 的开源版本由于其灵活性、开放性、强大的插件功能和易用性而成为显而易见的选择。

在本文中,我将分步演示如何使用 Jenkins 构建 CI/CD 流水线。

什么是流水线?

在进入本教程之前,了解有关 CI/CD 流水线 pipeline 的知识会很有帮助。

首先,了解 Jenkins 本身并不是流水线这一点很有帮助。只是创建一个新的 Jenkins 作业并不能构建一条流水线。可以把 Jenkins 看做一个遥控器,在这里点击按钮即可。当你点击按钮时会发生什么取决于遥控器要控制的内容。Jenkins 为其他应用程序 API、软件库、构建工具等提供了一种插入 Jenkins 的方法,它可以执行并自动化任务。Jenkins 本身不执行任何功能,但是随着其它工具的插入而变得越来越强大。

流水线是一个单独的概念,指的是按顺序连接在一起的事件或作业组:

流水线 pipeline ”是可以执行的一系列事件或作业。

理解流水线的最简单方法是可视化一系列阶段,如下所示:

 title=

在这里,你应该看到两个熟悉的概念: 阶段 Stage 步骤 Step

  • 阶段:一个包含一系列步骤的块。阶段块可以命名为任何名称;它用于可视化流水线过程。
  • 步骤:表明要做什么的任务。步骤定义在阶段块内。

在上面的示例图中,阶段 1 可以命名为 “构建”、“收集信息”或其它名称,其它阶段块也可以采用类似的思路。“步骤”只是简单地说放上要执行的内容,它可以是简单的打印命令(例如,echo "Hello, World")、程序执行命令(例如,java HelloWorld)、shell 执行命令( 例如,chmod 755 Hello)或任何其他命令,只要通过 Jenkins 环境将其识别为可执行命令即可。

Jenkins 流水线以编码脚本的形式提供,通常称为 “Jenkinsfile”,尽管可以用不同的文件名。下面这是一个简单的 Jenkins 流水线文件的示例:

// Example of Jenkins pipeline script

pipeline {
  stages {
    stage("Build") {
      steps {
          // Just print a Hello, Pipeline to the console
          echo "Hello, Pipeline!"
          // Compile a Java file. This requires JDKconfiguration from Jenkins
          javac HelloWorld.java
          // Execute the compiled Java binary called HelloWorld. This requires JDK configuration from Jenkins
          java HelloWorld
          // Executes the Apache Maven commands, clean then package. This requires Apache Maven configuration from Jenkins
          mvn clean package ./HelloPackage
          // List the files in current directory path by executing a default shell command
          sh "ls -ltr"
      }
    }
   // And next stages if you want to define further...
  } // End of stages
} // End of pipeline

从此示例脚本很容易看到 Jenkins 流水线的结构。请注意,默认情况下某些命令(如 javajavacmvn)不可用,需要通过 Jenkins 进行安装和配置。 因此:

Jenkins 流水线是一种以定义的方式依次执行 Jenkins 作业的方法,方法是将其编码并在多个块中进行结构化,这些块可以包含多个任务的步骤。

好。既然你已经了解了 Jenkins 流水线是什么,我将向你展示如何创建和执行 Jenkins 流水线。在本教程的最后,你将建立一个 Jenkins 流水线,如下所示:

 title=

如何构建 Jenkins 流水线

为了便于遵循本教程的步骤,我创建了一个示例 GitHub 存储库和一个视频教程。

开始本教程之前,你需要:

  • Java 开发工具包(JDK):如果尚未安装,请安装 JDK 并将其添加到环境路径中,以便可以通过终端执行 Java 命令(如 java jar)。这是利用本教程中使用的 Java Web Archive(WAR)版本的 Jenkins 所必需的(尽管你可以使用任何其他发行版)。
  • 基本计算机操作能力:你应该知道如何键入一些代码、通过 shell 执行基本的 Linux 命令以及打开浏览器。

让我们开始吧。

步骤一:下载 Jenkins

导航到 Jenkins 下载页面。向下滚动到 “Generic Java package (.war)”,然后单击下载文件;将其保存在易于找到的位置。(如果你选择其他 Jenkins 发行版,除了步骤二之外,本教程的其余步骤应该几乎相同。)使用 WAR 文件的原因是它是个一次性可执行文件,可以轻松地执行和删除。

 title=

步骤二:以 Java 二进制方式执行 Jenkins

打开一个终端窗口,并使用 cd <your path> 进入下载 Jenkins 的目录。(在继续之前,请确保已安装 JDK 并将其添加到环境路径。)执行以下命令,该命令将 WAR 文件作为可执行二进制文件运行:

java -jar ./jenkins.war

如果一切顺利,Jenkins 应该在默认端口 8080 上启动并运行。

 title=

步骤三:创建一个新的 Jenkins 作业

打开一个 Web 浏览器并导航到 localhost:8080。除非你有以前安装的 Jenkins,否则应直接转到 Jenkins 仪表板。点击 “Create New Jobs”。你也可以点击左侧的 “New Item”。

 title=

步骤四:创建一个流水线作业

在此步骤中,你可以选择并定义要创建的 Jenkins 作业类型。选择 “Pipeline” 并为其命名(例如,“TestPipeline”)。单击 “OK” 创建流水线作业。

 title=

你将看到一个 Jenkins 作业配置页面。向下滚动以找到 “Pipeline” 部分。有两种执行 Jenkins 流水线的方法。一种方法是在 Jenkins 上直接编写流水线脚本,另一种方法是从 SCM(源代码管理)中检索 Jenkins 文件。在接下来的两个步骤中,我们将体验这两种方式。

步骤五:通过直接脚本配置并执行流水线作业

要使用直接脚本执行流水线,请首先从 GitHub 复制该 Jenkinsfile 示例的内容。选择 “Pipeline script” 作为 “Destination”,然后将该 Jenkinsfile 的内容粘贴到 “Script” 中。花一些时间研究一下 Jenkins 文件的结构。注意,共有三个阶段:Build、Test 和 Deploy,它们是任意的,可以是任何一个。每个阶段中都有一些步骤;在此示例中,它们只是打印一些随机消息。

单击 “Save” 以保留更改,这将自动将你带回到 “Job Overview” 页面。

 title=

要开始构建流水线的过程,请单击 “Build Now”。如果一切正常,你将看到第一个流水线(如下面的这个)。

 title=

要查看流水线脚本构建的输出,请单击任何阶段,然后单击 “Log”。你会看到这样的消息。

 title=

步骤六:通过 SCM 配置并执行流水线作业

现在,换个方式:在此步骤中,你将通过从源代码控制的 GitHub 中复制 Jenkinsfile 来部署相同的 Jenkins 作业。在同一个 GitHub 存储库中,通过单击 “Clone or download” 并复制其 URL 来找到其存储库 URL。

 title=

单击 “Configure” 以修改现有作业。滚动到 “Advanced Project Options” 设置,但这一次,从 “Destination” 下拉列表中选择 “Pipeline script from SCM” 选项。将 GitHub 存储库的 URL 粘贴到 “Repository URL” 中,然后在 “Script Path” 中键入 “Jenkinsfile”。 单击 “Save” 按钮保存。

 title=

要构建流水线,回到 “Task Overview” 页面后,单击 “Build Now” 以再次执行作业。结果与之前相同,除了多了一个称为 “Declaration: Checkout SCM” 的阶段。

 title=

要查看来自 SCM 构建的流水线的输出,请单击该阶段并查看 “Log” 以检查源代码控制克隆过程的进行情况。

 title=

除了打印消息,还能做更多

恭喜你!你已经建立了第一个 Jenkins 流水线!

“但是等等”,你说,“这太有限了。除了打印无用的消息外,我什么都做不了。”那没问题。到目前为止,本教程仅简要介绍了 Jenkins 流水线可以做什么,但是你可以通过将其与其他工具集成来扩展其功能。以下是给你的下一个项目的一些思路:

  • 建立一个多阶段的 Java 构建流水线,从以下阶段开始:从 Nexus 或 Artifactory 之类的 JAR 存储库中拉取依赖项、编译 Java 代码、运行单元测试、打包为 JAR/WAR 文件,然后部署到云服务器。
  • 实现一个高级代码测试仪表板,该仪表板将基于 Selenium 的单元测试、负载测试和自动用户界面测试,报告项目的运行状况。
  • 构建多流水线或多用户流水线,以自动化执行 Ansible 剧本的任务,同时允许授权用户响应正在进行的任务。
  • 设计完整的端到端 DevOps 流水线,该流水线可提取存储在 SCM 中的基础设施资源文件和配置文件(例如 GitHub),并通过各种运行时程序执行该脚本。

学习本文结尾处的任何教程,以了解这些更高级的案例。

管理 Jenkins

在 Jenkins 主面板,点击 “Manage Jenkins”。

 title=

全局工具配置

有许多可用工具,包括管理插件、查看系统日志等。单击 “Global Tool Configuration”。

 title=

增加附加能力

在这里,你可以添加 JDK 路径、Git、Gradle 等。配置工具后,只需将该命令添加到 Jenkinsfile 中或通过 Jenkins 脚本执行即可。

 title=

后继

本文为你介绍了使用酷炫的开源工具 Jenkins 创建 CI/CD 流水线的方法。要了解你可以使用 Jenkins 完成的许多其他操作,请在 Opensource.com 上查看以下其他文章:

你可能对我为你的开源之旅而写的其他一些文章感兴趣:


via: https://opensource.com/article/19/9/intro-building-cicd-pipelines-jenkins

作者:Bryant Son 选题:lujun9972 译者:wxy 校对:wxy

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