返回介绍

C.1 bash

发布于 2024-01-27 21:43:11 字数 9183 浏览 0 评论 0 收藏 0

如果你用的是基于 bash 的命令行,你在 C.1.1 节学到的内容也同样适用于任意基于 bash 的客户端,这和你当前使用的操作系统无关。太酷了! bash 是一种功能强大的 shell 语言(或命令行语言)。我们开始学习 bash,首先来看如何在计算机中浏览文件。

C.1.1 跳转命令

在命令行中浏览计算机可以帮你理解用 Python 如何做到这一点。停留在终端或文本编辑器中,可以让你保持专注。

我们首先来看基本命令。打开终端。打开的终端可能会位于 ~ 文件夹,代表你的 home 目录。如果你用的是 Linux,home 目录可能位于 /<home/your_computer_name>。如果你用的是 Mac,home 目录可能位于 /Users/<your_name>。想要查看你所在的文件夹,可以输入:

pwd

你应该会看到像这样的输出:

/Users/katharine

或者像这样:

/home/katharine

pwd 代表“打印工作目录”(print working directory)。你让 bash 告诉你当前所在的文件夹(或目录)。如果你是第一次学习用命令行跳转,那么这条命令很有用,特别是你想再次确认自己是否位于正确的文件夹中时。

另一个有用的命令用来查看文件夹中都有哪些文件。想要查看当前工作目录中都有哪些文件,输入:

ls

你应该会看到像这样的输出:

Desktop/
Documents/
Downloads/
my_doc.docx
...

具体内容可能会有所不同,颜色也可能不同,这与你的操作系统有关。ls 的含义是“列出清单”(list)。在调用 ls 时还可以指定额外参数,叫作标记(flag)。这些参数会改变输出的内容。试一下这个命令:

ls -l

输出应该有许多列,最后一列与只输入 ls 的输出相同。-l 标记给出了目录的详细(长)内容,其中包括所包含的文件和目录的数目,以及每一个文件和目录的权限、创建者的名字、组所有权、大小和最后修改日期。下面给出一个实例:

drwxr-xr-x  2 katharine katharine  4096 Aug 20  2014 Desktop
drwxr-xr-x 22 katharine katharine 12288 Jul 20 18:19 Documents
drwxr-xr-x 26 katharine katharine 24576 Sep 16 11:39 Downloads

这些细节可以帮你发现与权限有关的问题,还可以查看文件大小和其他信息。你还可以向 ls 传入任意目录,它都可以列出里面的内容。试着查看下载文件夹的内容(输入以下代码):

ls -l ~/Downloads

你会看到与前面类似的很长的输出,但列出的是 Downloads 文件夹下的所有文件和目录。

现在你学会了如何列出不同文件夹下的文件,下面我们来学习如何改变当前所在文件夹。我们利用 cd 命令来“改变目录”(change directory)。试着输入:

cd ~/Downloads

现在用 pwd 查看位于哪个文件夹,用 ls 查看文件夹中的文件,你应该会发现正位于 Downloads 文件夹下。如果你想回到主文件夹的话,应该怎么做?我们知道主文件夹是上一级文件夹。你可以用 .. 跳转到上一级文件夹。试着输入:

cd ..

现在你回到了主文件夹。在 bash 中,.. 的意思是“跳转到上一级目录”。你还可以连用两次,跳转到上两级目录,像这样:cd ../..。

 在命令行中跳转目录或选择文件时,你应该可以用 Tab 键自动补全文件名和文件夹名。对于你想选择的文件或文件夹,先输入名字的第一个字母或前两个字母,然后只需按下 Tab 键,你应该会看到不同的匹配选择(帮你完成名字的拼写)。如果没有类似名字的其他文件,命令行会将名字自动补全。这个方法可以节省很多打字的时间!

现在你应该更习惯于用命令行来跳转目录。下面我们将学习如何用命令行移动文件和修改文件。

C.1.2 修改文件

利用 bash 移动文件、复制文件和创建文件都很简单。我们先来看创建新文件。首先,跳转到 home 目录(cd ~)。然后输入下列内容:

touch test_file.txt

然后再继续输入 ls。你应该会看到有一个叫作 test_file.txt 的新文件。touch 可以用来创建新文件。这个命令会寻找叫这个名字的文件。如果有这个文件的话,会改变最后一次修改的时间戳,但不会修改文件内容;如果文件不存在,会创建这个文件。

Atom shell 命令

如果你的文本编辑器是 Atom.io(https://atom.io/),你可以利用下面这个命令轻松将这个文件(或任何文件)用 Atom 打开:

atom test_file.txt

如果报错的话,你可能没有安装命令行选项。安装方法是:按 Shift-Cmd-P 键打开命令面板,然后运行 Install Shell Commands 命令。

想要查看Atom 所有命令行选项,可以输入atom --help。

对于之前创建的文件,我们试着将其复制到下载文件夹中:

cp test_file.txt ~/Downloads

这里我们的意思是:“将 test_file.txt 复制到 ~/Downloads 文件夹中。”bash 知道 ~/Downloads 是一个文件夹,所以会自动将文件复制到那个文件夹里面。如果我们想要在复制文件的同时改变文件名,可以这么做:

cp test_file.txt ~/Downloads/my_test_file.txt

这个命令的作用是让 bash 将测试文件复制到下载文件夹中,并将复制后的文件命名为 my_test_file.txt。现在你的下载文件夹中应该有测试文件的两份副本:一个用的是原来的名字,一个用的是新名字。

 如果你需要多次运行同一个命令,只需按向上键,在命令行历史中查找。如果你想查看最近所有的命令行历史,可以输入 history。

有时你并不想复制文件,而是想要移动文件或重命名文件。在 bash 中,我们可以用同一个命令来移动文件和重命名文件:mv。我们首先对在主文件夹中创建的文件进行重命名:

mv test_file.txt empty_file.txt

这里我们告诉 bash:“将名为 test_file.txt 的文件移动到名为 empty_file.txt 的文件。”输入 ls,你应该会看到已经没有 test_file.txt 了,但现在有一个 empty_file.txt。我们只是利用“移动”来对文件重命名。我们还可以利用 mv 在文件夹之间移动文件:

mv ~/Downloads/test_file.txt .

这里我们的意思是:“将下载文件夹中的 test_file.txt 移动到这里。”在 bash 中,. 代表你的工作目录(就像 .. 代表当前目录的“上一级”文件夹一样)。现在输入 ls,你应该可以看到主文件夹中又有一个 test_file.txt 文件了。你还可以输入 ls ~/Downloads,现在这个文件已经不在下载文件夹中了。

最后,你可以用命令行删除文件。你可以用 rm(remove)命令来做到这一点。试着输入:

rm test_file.txt

现在再输入 ls,你会发现 test_file.txt 已经从文件夹中删掉了。

 与用鼠标删除文件不同,用命令行删除文件是真正的删除。没有“回收站”可以恢复文件,所以使用 rm 时一定要小心,对你的计算机和代码一定要定期按时备份。

现在你知道利用 bash 如何移动、重命名、复制和删除文件,下面我们继续学习在命令行中运行文件。

C.1.3 运行文件

利用 bash 运行文件是相当简单的。在第 3 章中你可能已经学过运行 Python 文件,你只需运行:

python my_file.py

其中 my_file.py 是一个 Python 文件。

 对于编程用到的大多数语言来说,只输入语言的名字(python、ruby、R)和文件名(并带有正确的文件路径或文件位置)就可以运行。如果你在用某种语言运行文件时遇到问题,我们建议以语言的名字和“命令行选项”(command-line options)为关键词在网络上进行搜索。

作为一名 Python 开发者,你还会用到其他运行命令。表 C-1 中给出了其中一些命令,你可以先了解一下,在安装和运行外部库时可能会用到。

表C-1:bash中的运行命令

命令

使用案例

更多文档

sudo

以 sudo 或(超级)用户的身份运行下面的命令。在修改文件系统的核心部分或安装外部包时通常需要用到 sudo

https://en.wikipedia.org/wiki/Sudo

bash

运行 bash 文件,或回到 bash shell

http://ss64.com/bash/

./configure

运行软件包的配置设定(从源代码安装软件包的第一步)

https://en.wikipedia.org/wiki/GNU_build_system#GNU_Autoconf

make

配置完成后运行 makefile,编译代码准备安装(从源代码安装软件包的第二步)

http://www.computerhope.com/unix/umake.htm

make install

运行 make 编译好的代码,将软件包安装到计算机中(从源代码安装软件包的第三步)

http://www.codecoffee.com/tipsforlinux/articles/27.html

wget

访问 URL,并下载 URL 里包含的文件(适用于下载软件包或文件)

http://www.gnu.org/software/wget/manual/wget.html

chown

改变文件或文件夹的所有权。通常与 chgrp 一起使用,用来改变文件的所属群组。如果你需要移动文件让另一个用户可以运行这些文件,那么这个命令是很有用的

http://linux.die.net/man/1/chown

chmod

改变文件或文件夹的权限,通常是使文件可执行,或对另一类用户或用户组可见

http://ss64.com/bash/chmod.html

在使用命令行的过程中,你可能会遇到其他各种各样的命令和文档。我们建议你花点时间去学习、使用并提问。bash 是一种不同的语言,需要慢慢去学习它的特点和用法。最后,我们要向你介绍利用 bash 来搜索文件或文件内容。

C.1.4 利用命令行进行搜索

在 bash 中,搜索文件和在文件内搜索都相对简单,也有很多种方法。我们将向你展示几种方法。首先,我们将会用一个命令搜索文件中的文本。我们先用 wget 下载一个文件:

wget http://corpus.byu.edu/glowbetext/samples/text.zip

这应该会下载一个文本语料库,我们可以在里面搜索。将文本解压到一个新文件夹,只需输入:

mkdir text_samples
unzip text.zip text_samples/

现在在新文件夹 text_samples 中应该有许多文本语料库文件。输入 cd text_samples 切换到这个目录中。我们利用一个叫作 grep 的工具来搜索这些文件的内容:

grep snake *.txt

这里的命令是告诉 bash,在这个文件夹所有以 .txt 结尾的文件中搜索字符串 snake。在 7.2.6 节可以学到更多关于通配符的内容,但 * 几乎总可以用作通配符,意思是“任意匹配的字符串”。

运行上面的命令,你应该会看到输出大量匹配的文本。grep 会返回所有匹配文件中包含目标字符串的所有行。比如当你要修改某个函数,想在一个很大的仓库中找到包含这个函数的文件时,这一命令特别有用。如果你想打印出前后的几行,还可以向 grep 传入额外的参数和选项。

 想查看任意 bash 命令的选项,只需先输入该命令,然后输入空格和 --help 即可。输入 grep --help,然后阅读 grep 的一些额外选项和特性。

另一个简洁的工具是 cat。它只是打印出你指定的文件内容。这个命令很有用,特别是需要将输出内容通过“管道”(pipe)传递到其他地方时。在 bash 中,| 字符可以将你希望对文件或文本执行的一系列操作合并在一起。例如,我们将其中一个文件的内容 cat 出来,然后用 grep 在输出中搜索:

cat w_gh_b.txt | grep network

首先返回的是 w_gh_b.txt 文件的所有文本,然后通过“管道”将输出传递给 grep,然后在其中搜索单词 network 并在命令行中返回包含该词的文本行。

我们还可以对 bash 历史记录做同样的管道操作。试着输入:

history | grep mv

这一命令可以帮你找到在学习 bash 的过程中用过的命令并复用,你可能已经不记得这些命令了。

我们来进一步学习搜索,学习如何查找文件。首先,我们将用到一个叫作 find 的命令,用来查找匹配的文件名,还可以遍历所有子目录并查找匹配的文件。我们在当前文件夹及其子文件夹中找出所有文本文件:

find . -name "*.txt" -type f

这一命令的作用是,(在这个文件夹及其所有子文件夹中)寻找相应的文件,文件名以 .txt 结尾,文件类型为 f(标准文件,而不是目录,目录的类型符号为 d)。你应该会看到输出许多匹配的文件名。下面,我们将这些文件通过管道传递给 grep 命令:

find . -name "*.txt" -type f | xargs grep neat

这里我们让 bash 做的是,“找到与上面相同的文本文件,然后在这些文件中搜索单词 neat”。我们用到了 xargs 命令(https://en.wikipedia.org/wiki/Xargs),这样才能将 find 的输出通过管道正确地传递给 grep。不是所有的管道操作都需要用到 xargs,但当 find 命令的输出结果不完全相同时,这一命令十分有用。

你已经学会搜索和查找的一些实用技巧,特别是你要处理的代码和项目越来越庞大、越来越复杂时,这些技巧尤其有用。关于这一话题,我们还为你提供了更多资源和阅读材料。

C.1.5 更多资源

在互联网上有许多优秀的 bash 学习资源(http://wiki.bash-hackers.org/scripting/tutoriallist)。Linux 文档计划(http://www.tldp.org/LDP/Bash-Beginners-Guide/html/)中也有许多适合初学者的优秀教程,里面会讲到一些高级的 bash 编程知识。O'Reilly 出版了一本很棒的 bash Cookbookhttp://shop.oreilly.com/product/9780596526788.do),你也可以用这本书开始学习。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文