全文共
4108
字,预计学习时长8
分钟或更长
你是否注意到,电影中超级讨厌的黑客仅仅只需键入几行指令,盯着黑底绿字的屏幕就能轻易渗透最安全的银行系统,将银行账户洗劫一空。这个人是如何只需敲击几下键盘便能畅通无阻访问所有密码并控制所有的隐藏摄像的呢?电影制作方如何达成这一效果并不好说,这有悖原理!但也许这就是他们的目的:通过镜头告诉观众 “commandline”是多么强大的工具!
很多时候,由于初学者太习惯于使用图形用户界面(Graphical User Interface)界面,而容易忽略命令行界面(Command-lineinterface)的功能。当用户需要将大约十万个文件复制到一个文件夹中时,使用鼠标就可以实现,但是如果需要对这些文件进行重命名或者根据其扩展名将这些文件进行分类又该如何?由于GUI不可编程,使用“command line”操作是不可行的。然而通过键入几行代码,就能快速完成这一操作。
对不同的开发人员而言,Unix shell都是非常强大的工具。本文旨在介绍UNIX操作系统基础知识。
UNIX
除了WINDOWS之外,如今大多数的操作系统都是在UNIX基础上构建。其中包括Linux发行版,macOS,iOS,Android等。看一眼UNIX操作系统的族谱就足以突出UNIX的重要性,这也是它在业界采用如此广泛的原因。事实上,许多数据和计算系统的后端,包括像Facebook和谷歌这样的行业巨头,都大量使用UNIX。
UNIX族谱 图片来源:WIkipedia
Shell
Shell是用于在计算机上运行程序的命令行界面。用户在提示符下键入一串命令,shell为用户运行程序,然后显示输出。用户可以直接输入命令,也可以从称为名为shell脚本或shell程序的文件中读取。
Shell types
UNIX系统通常提供多种shell类型。以下是常见的Shell类型:
本文只针对Bash Shell,对其他类型不做详细介绍。但是,也鼓励你阅读并尝试其他shell类型,特别是zsh shell,因为在苹果最新一代名为Catalina的Mac操作系统中,zsh将代替bash shell。所以现在了解它再好不过。
终端
终端是用于与shell交互的程序,是Shell和其中运行的其他命令行程序的交互界面。类似于Web浏览器是网站的界面。以下是Mac上典型终端的外观:
典型MAC终端示例图
Mac和Linux有各自版本的终端。Windows还有一个内置命令shell,但它基于MS-DOS命令行而不是UNIX。所以接下来请看如何在Windows上安装shell和终端程序,使其运行与在Mac和Linux上的相同。
Windows系统中安装
· Windows系统Linux子程序
WSL是Windows 10发布的新版Linux兼容系统,允许开发人员直接在Windows上运行GNU / Linux环境 - 包括大多数命令行工具,实用程序和应用程序-不用修改,无需虚拟机开销。
· Git Bash命令
本文中将使用Git Bash命令。下载安装后将得到一个终端窗口,如下图所示。
WindowsGit Bash示例图
终端探索
每当打开终端窗口时,都会看到上次登录凭据和Shell提示。只要shell准备好接受输入,就会出现Shell提示符。根据发行版本的不同,显示可能会稍有不同,但大多数情况下显示为username @machinename后跟$符号。
如果你不想显示以上信息,可以使用PS1自定义shell提示符。
终端现在只在提示符下显示$。但这只是暂时的,一旦终端关闭,将重置为其原始设置。
入门
为掌握Bash入门知识,请尝试下列简单命令:
· echo:返回在shell提示符下键入的内容,类似于在Python中打印。
· date:显示当前时间和日期。
· cal:显示当月的日历。
· 清除终端:按住Ctrl-L或删除清除终端。
Bash命令基本知识
Bash命令是Bash可以独立执行的最小代码单元。这些命令告诉Bash需要做什么。Bash通常从用户方接收单个命令,并在命令执行后返回给用户。
工作目录
Pwd命令(Print Working Directory)
PWD是Print Working Directory的缩写,其功能是显示当前工作目录,即shell当前正在查看的目录,也是shell命令查找数据文件的默认位置。
目录类似于文件夹,但在Shell中,称为目录。UNIX文件层次结构呈树状。要访问特定的文件夹或文件,需要穿过树结构中的某些特定路径。路径需借助斜杠(/)字符分隔上述结构的每个节点。
文件定位/文件导航
如Ls和cd这样的命令用于定位和管理文件。
Ls
Ls是list(列表)的缩写,其功能为列出目录的内容。通常会从主目录开始查看。这意味着如果自行运行Ls,将始终显示当前目录的内容,依据我的经验是/ Users / parul。
shell和GUI界面中主目录显示图示例。
Parameters
与Ls命令一起使用时,参数和选项会开启部分特殊功能。
· ls<folder>:查看特定文件夹的内容。
· ls-a:用于列出文件夹中的所有隐藏文件。
· ls-l:显示更长,更详细的文件列表。ls -l还可以与Directory的名称一起使用,以列出指定目录文件。
· ls~:tilde(?)是表示主目录的快捷方法。因此,无论进入哪个目录,ls~将始终列出主目录。
通配符
shell还支持文件名与模式匹配,用星号(*)表示。通过通配符来替换给定模式中的其他字符。例如,如果列出*.txt,wildcard,所有.txtextension的文件都会被列出。接下来请尝试列出Demo文件夹中的所有.py文件:
Cd命令
Cd是更改目录(Change Directory)的缩写,其功能为将活动目录更改为指定的路径。在进入目录后,可以使用ls命令查看该目录的内容。下列是使用此命令的一些方法:
· cd<Directory>:将当前目录更改为所需的目录。定位到Demo目录中的测试目录,并使用Ls命令查看内容。请注意,也可以使用分号(;)在同一行上键入两个命令。
· cd..:返回父目录。
· cd:返回主目录。
管理文件
一些命令可以从shell中移动,删除,创建和复制文件。
Mkdir命令
Mkdir是make directory的缩写,用于创建新目录或文件夹。
Mv命令
Mv是移动(Move)的缩写,其功能为将一个或多个文件或目录从一个地方移动到另一个地方。用户需要指定想要移动的内容,即源和想要移动的位置,即目的地。
演示文件夹中创建一个名为PythonFiles的新目录,并使用上述两个命令将Demo文件夹中的所有.py文件移入其中。
Touch命令
Touch命令用于创建新空白文件,还用于更改现有文件和目录的时间戳。以下是如何在Demo文件夹中创建名为foo.txt的文件的图示。
Rm命令
Rm是删除(remove)的缩写,其功能为删除文件或目录。默认情况下,它不会删除目录,但如果在目录中用作rm-r *,则该目录下所有目录文件都会被删除。接下来请删除之前创建的foo.txt文件。
Rmdir命令
Rmdir是删除目录(remove directory)的缩写,用于从文件系统中删除空目录。让我们删除前一段时间创建的PythonFiles文件夹。
注意:/标示父目录
查看文件
查看文件是Shell的另一实用功能。一些命令可以帮助用户查看文件的内容,以便操作。
Cat命令
Cat是concatenate的缩写,用作读取文件并输出其内容。Cat命令可以读取任意数量的文件,因此命名为concatenate。Demo文件夹中有一些文本文件,现在使用cat命令查看其内容。
查看多个文件,需在cat命令后键入文件名:
$ cat Names.txt fruits.txt
Less命令
Cat命令在屏幕上显示文件内容。文件较少时,使用cat命令并无大碍,但是当文件过大时就会造成问题。从下图示例中可以看出,该命令快速弹出终端所有内容,但却无法理解文件所有内容。幸运的是,名为less的命令,允许一次查看一个屏幕的内容。
$ less babynames.txt
以下是使用less命令的示例
Spacebar :To go to the next screen
b:to go to the previous screen
/:to search for a specific word
q:quit
Pipelinesand Filters管道和过滤器
管道运算符“|”(垂直条)是一种将一个命令的输出作为输入发送到另一个命令的方法。
command1 | command2
当命令将其输出发送到管道时,该输出的接收端是另一个命令,而不是文件。下图显示了wc命令如何计算cat命令显示的文件内容。
在某种程度上,wc是一个接收输入并以某种方式转换这些输入的命令。这些命令称为过滤器,放于Unix管道之后。
Filters过滤器
接下来请看一些常用的过滤器命令。我们将使用一个名为babynames.txt的文件,其中包含大约1000个婴儿的姓名和一个包含少量水果名的fruits.txt文件。
· Grep(全称:global regular expression print)搜索具有给定字符串的行或查找指定输入流中的模式。以下命令将读取所有文件并输出包含单词“Tom”的所有行。
但这是一个庞大的列表,我们无法理解所有数据只是在终端爆炸。接下来请看如何使用管道操作符来理解。
Wc是字数统计(word count)的缩写。它读取文件列表并生成以下一个或多个统计信息:换行计数,字数和字节数。将上述grep命令的输出输入到wc,以计算包含单词“Tom”的行数。
排序过滤器按首字母顺序或数字顺序对行进行排序
cat命令首先读取文件fruits.txt的内容,然后对其进行排序。
uniq代表unique,它提供输入流中特殊行的数量。
值得注意的是,除非它们相邻,否则uniq无法检测重复的条目。因此在使用sort命令之前需要对文件进行排序。或者,你也可以使用sort -u来替换uniq。
由于多个命令可以放在一个Pipeline中,因此Pipeline在执行某些复杂任务时非常方便。