面向数据科学家的有效Linux和Bash指南

2020-12-17 00:33:03

2020年11月,DAGsHub为有抱负的数据科学家提供了出色的Y-DATA课程的一系列客座演讲,我们现在希望以博客形式与任何发现它有用的人分享!

主题-系统,IT,DevOps,MLOps,无论您想调用它的其他名称是什么-在Python(或R或Matlab等)的上下文之外,如何使计算机执行所需的操作辨析)?您如何获得一个漂亮的神经网络,使其在云中的实际服务器上运行,从而可以为实际用户提供服务?

当气泡破裂并且您必须走出Jupyter笔记本以解决问题时该怎么办?

当然,这是一个广泛的问题,需要很多以前的知识来回答。在我们的讲座中,我们希望首先为学生立足打下坚实的基础。因此,我们走了经典之路-什么是Linux?人们为什么使用它?什么是Bash?如何使用终端?如何退出vim ?!

我们没有创建关于如何在终端中移动和复制文件的另一教程,而是要介绍以下观点:

使用这些工具以通过游戏获得了解和学习更多知识的思维框架是什么?

因此,本指南/备忘单是有关我们的提示和技巧的更多信息,绝对不是详尽无遗。相反-我们想充分利用学生资源时间,只谈论有趣的事情。可以根据需要学习其他内容。

该课程和一些技巧是针对想要介绍Linux& Linux主题的数据科学家。重击但是,数据科学方向主要是在一些特定领域的技巧中发挥作用,并且在陈述的动机中学习这些东西-如果您是一位有抱负的Web开发人员,没有理由不从中受益指导!

由Linus Torvalds开发,他还发明了Git来管理Linux的源代码。

操作系统是一个程序,它在计算机打开后会占用一点时间。

在计算机开机后的最初几秒钟,主板运行一个名为BIOS的小型硬编码操作系统,但它很快将控制权移交给了某些操作系统内核,该内核已安装在其中一个硬盘驱动器(即USB记忆棒)中。或CD。

从那时起,内核将决定何时运行哪些程序,以及如何(通过驱动程序)控制物理设备。

操作系统是打包在一起的程序捆绑。内核是最重要的部分,但是它带有更多程序,可以帮助用户与内核进行通信。

例如文件浏览器是操作系统的一部分,但不是内核的一部分-它们只是位于用户和内核之间的图形界面。

操作系统通常还处理文件系统,用户权限,内存管理和许多其他事情。

统一Linux家族中所有不同操作系统的原因是它们都使用相同的Linux内核-其他部分有所不同。有关发行版的更多内容,请参见后面的内容。

令人惊讶的是,操作系统只是一种系统。系统是由人设计的,更好的设计可以带来更好的性能,稳定性和灵活性。 Linux只是设计更好的操作系统。它超级灵活,稳定-蓝屏死机在生产Linux服务器中极为罕见,并且它们的性能非常可靠。这就是为什么大多数生产系统都在Linux上运行的原因,这也是为什么对从事Linux技术工作的任何人都有益的原因。亲爱的读者,其中包括您。

开源可以带来高质量,因为错误的隐患更少了。开发人员可以暗中检查以确保其Linux应用程序能够正常运行,而不用猜测并依赖封闭源操作系统开发人员的可疑文档。

但是强大的功能和灵活性带来了出色的射击能力。 Linux也使这变得容易。

进入Linux世界时,令人困惑的事情之一就是您所面对的巨大术语。感觉就像是在解释,期望您已经了解并理解了许多其他术语,而无需逐步理解。因此,我想为您简要介绍可能遇到的术语及其含义。

Mac和Unix非常相似,但从技术上讲不是Linux。除非您深入研究,否则您将很难分辨出差异。

Unix比Linux老,并且极其相似-实际上,Linux是Unix的开源重新实现(这是封闭的,但是非常好)。这几乎是具有历史意义的琐事,因为Unix在当今很少见,但知道有些人可以互换使用Unix和Linux。

通常,在外观和感觉上都与Unix(符合POSIX或* nix)的操作系统类似。当您看到这些单词时,请将它们翻译为“遵循Linux的约定,例如用于文件操作的基本命令(ls,cd,mkdir)和" /"作为文件系统的根目录等。”

GNU是一大套免费软件,是大多数Linux的基础-编译器,C库,压缩文件程序以及许多其他工具。它也是独立POSIX操作系统的名称,与Linux相比,围绕自由软件的思想更坚定。

以上所有系统以及Linux本身都是POSIX兼容或* nix系统的示例。

有(太多?)种“真正的Linux”,称为发行版或发行版。区分它们可能会令人头疼。

发行版就像是一家公司发明了一个新的操作系统。他们用新的外围程序包包装Linux内核-即它们可能使用不同的GUI程序组合,默认情况下支持不同的硬件,等等。它们偶尔会发布新版本。

底线–除非您知道自己在做什么,否则只需使用Ubuntu。它是最用户友好,受广泛支持且易于安装的。

红帽企业Linux或RHEL是另一种发行版,有时在重型生产服务器中使用。 Fedora与RHEL在桌面上是等效的-通常,旨在在RHEL服务器上运行其应用程序的开发人员会将Fedora用于其开发计算机,以避免兼容性问题。

Alpine是一个超级极简发行版,可用于许多Docker映像。阅读我们有关Docker的博客文章以获取更多信息。

当人们想到Linux时,通常会将其与一个可怕的终端相关联(加上附带有帽衫的匿名黑客👩‍💻)。

不要惊慌-它并不那么可怕!如今,如果您选择了一个关心此类问题的发行版(例如Ubuntu),则使用常规的GUI向导在计算机上安装Linux确实很容易。

在本讲座中,我们将重点介绍端子/外壳,因为它总是可用的,并且通常在“实际工作”中。已经完成了。生产服务器很少有GUI。不要让这让您灰心-在您习惯了它之后,使用Shell会比GUI更加方便!

以下操作是非常基本的文件操作命令-移动,复制,删除,查看等。我认为在线上有足够的资源来学习这些基本命令,因此在此不再赘述。在列表下方,我提供了推荐的方法来了解它们,所以请不要担心!

即使您没有可用的Linux终端,我发现学习这些命令的最便捷方法是遵循以下教程:

https://www.webminal.org/terminal/完成第3课,包括第3课。Webminal在浏览器中包含一个交互式终端,您可以将其与下一个教程一起玩并使用(该教程没有交互式内容)。外壳,只有文字和测验)。

通过将适当的消息发送到内核,将命令转换为新的正在运行的程序-进程

例如,当我键入python hello_world.py并按Enter时,shell会做什么?

它负责知道实际程序在何处调用了" python"位于文件系统中-可能类似于/ usr / bin / python。最后,内核是唯一可以运行新程序的事物,并且它期望文件的绝对路径。

我可以检查外壳程序实际上在哪里找到" python"通过运行哪个python。 which命令输出外壳程序找到的完整路径。怎么知道稍后在可运行脚本部分中进一步介绍。

这是一个有用的命令!也许您安装了几个相互冲突的python版本,但您不确定哪个正在实际运行并给您带来问题。哪个python可以解救!

或者,也许我有一些可运行的脚本,我想对其进行编辑,删除或重命名,但我忘记了它的位置。哪来救援!

因此,实际发生的是外壳程序告诉内核程序:"请获取位于/ usr / bin / python的程序文件,并将其转换为带有单个参数/ absolute / path / to的新运行进程/hello_world.py,在当前目录中运行。另外,请发送所有这些过程'输出回给我(shell进程),这样我就可以将它们显示给用户。

外壳还可以执行诸如扩展路径之类的操作-例如〜,当前用户的主文件夹,只有Shell才知道,内核则不知道。当您键入cd〜/ projects时,shell将其转换为cd / home / username / projects。

外壳程序还具有更多功能-变量,if,循环。 Shell脚本是一种完整的编程语言。

但我建议不要在其中编写任何复杂的内容-尝试将复杂性卸载到" real"编程语言。 Shell脚本非常方便,但是很难读取,维护和调试。

有一点有用的知识-您可以使用布尔运算符&&和||,与您在编程语言中使用它们的方式相同:

python script_that_fails.py ||回声"错误! :("#错误!:(python script_that_succeeds.py || echo" Error!:("#python script_that_fails.py&& echo" Success!:)&# 34;#python script_that_succeeds.py&& echo" Success!:)"#Success!:)

外壳程序会根据其"退出代码"来知道命令是否成功。除零以外的任何代码均表示失败。一些命令返回不同的退出代码以指示出了什么问题。要查看最后一个命令的退出代码,请使用echo $?。在此博客中,我不会对此进行更详细的介绍。

世界上有许多不同的shell程序,但是最通用的是sh(Bourne Shell)及其改进的后继bash(Bourne Again SHell的缩写)。就个人而言,我使用zsh,因为它具有我喜欢的更高级的功能,同时向后兼容bash。要查看我推荐的zsh设置,请参阅本指南的结尾。

如果您考虑一下,桌面和其他GUI实际上就像是外壳,将鼠标考虑在内并在窗口上绘制像素,而不是在终端上绘制字符!

举例说明-在文件资源管理器中双击hello_world.py时,它执行的操作与我在运行python hello_world.py时所述的操作非常相似。

#设置变量很简单:R2 = D2#然后,无论您在以后的命令中使用$ R2哪里,shell都会#将$ R2替换为变量的值,在这种情况下为" D2&#34 ; echo $ R2#D2

有时,获取一个命令的输出并在另一命令的主体中使用它很有用。例如,假设您想跟自己打个招呼。您可以通过以下几种方式之一进行操作:

#反引号-执行反引号中的命令,#并将其输出字符串插入命令中。#在这种情况下,whoami命令输出您的用户名:ME =`whoami`echo Hello $ ME!#Hello username!#也可以在一个stepecho Hello`whoami`中直接使用!#Hello用户名!#比反引号更通用并且工作原理相同-#您可以使用$()甚至嵌套itecho Hello $(echo $(whoami),再见) !#您好用户名,再见!

管道允许您将一个命令的输出作为输入连接到另一命令。

#打印filecat bigfile的前10行|头-10#打印filecat bigfile的第7-10行|头-10 | tail -3#使用名为" less",#的文本阅读器轻松阅读bigfile的全部内容,从而使您可以上下滚动并进行搜索。减

* nix的核心理念是使用管道从简单的零件创建复杂的逻辑。请参阅这篇简短而有趣的博客文章,以获取很好的解释。

标准错误-stderr通常,任何警告或错误都会打印到stderr。这样做是为了保持stdout的干净,以便管道命令获得您希望它们处理的实际数据,而不会出现诸如弃用警告之类的垃圾。

还有一些更重要的运算符:<和>将这些流直接连接到文件。

#打印文件的第7-10行#与上面的cat示例示例在功能上相同。#cat读取bigfile并将其输出到cat的stdout,该stdout连接到head的stdin。 <运算符只是直接将bigfile连接为head的stdin!head -10<大文件|尾巴-3#操作符将echo的stdout连接到名为numbers的文件。如果不存在,它将创建该文件,如果存在,则将其覆盖。echo 123> numbercat数字#123#相同,但>>不会覆盖现有文件,而是将其附加到themecho 1.618>> numberscat数字#123#1.618#如果要运行某个程序并将其所有输出记录到文件中,则#您应使用&而不是> (或&>而不是>>)。#&> python3 my_long_training_script.py&>否则,您可能不会在日志中看到警告消息和错误,有时这是最重要的部分! log.txt

您将经常需要使用&>或&>在执行其他操作时运行长流程时-例如模型训练或数据处理!这样,您便可以在过程完成或崩溃后查看日志,并尝试调试是否出现问题。

如果要停止当前正在运行的命令,请使用ctrl + c(否,在这种情况下,这并不意味着" copy")。

#等待314秒。谁有时间?!睡眠314#现在单击ctrl + c并重新控制您的生活!

* nix系统使所有文件,设备,磁盘等在一个以根目录/开始的文件系统下可用。与Windows不同,没有C:\驱动器。

按照惯例,在根文件夹下,您会看到一些具有标准名称的文件夹,例如/ etc,/ dev,/ home,/ var等。这些仅在尝试执行更高级的操作时才有意义,因此我将其保留在本指南之外。如果您想知道这种常规文件夹结构的含义是什么,请参阅以下单独的指南。

除非您知道自己在做什么,否则只应该在/ home / username /中自己的主文件夹中进行操作。在您的主文件夹中,通常创建一个新文件夹来容纳您所有的项目和游乐场,并将其限制在该文件夹中通常是一个安全的好主意。

路径区分大小写!与Windows不同。极力避免在不同情况下创建两个具有相同名称的文件或文件夹。如果以后尝试将这些文件复制到Windows计算机,则会遭受损失。

隐藏的文件和文件夹-以开头。 -使用ls -la查看它们。我更喜欢总是使用ls -la,所以我为此做了一个捷径!

别名l =" ls -la"意味着无论何时我跑步,它都能迅速完成我想要的!

避免在文件或文件夹名称中出现空格! 使用破折号或下划线可以使生活更快乐。 否则,您将必须执行解决方法: mkdir"带空格的文件夹"带空格的cd文件夹#cd:参数太多cd"带空格的文件夹"#好! 典型场景-编写或下载Shell脚本或程序,尝试通过键入文件名运行它,然后出现错误: 但是script.sh就在当前工作目录中! 🤨😡🥺😭😞 这是因为外壳程序使用以下两种方法之一来确定要运行的程序的位置: 如果您不仅指定程序文件的名称,还指定其路径(相对或绝对),那么外壳程序将理解您想要的内容并尝试运行它。 所以./script.sh可以工作。 如果您未指定路径,则外壳程序会在称为PATH的特殊外壳程序变量内列出的所有目录中搜索script.sh。

您可以通过运行echo $ PATH并获取如下内容来检查您的PATH:

那是用:分隔的文件夹列表。 Shell会一一查看它们,直到找到一个名为script.sh的可执行文件。

在这种情况下,由于我们的当前目录不在PATH中,因此无法找到它。就python而言,它成功了,因为PATH中的/ usr / bin / IS。

我建议在您的主目录中创建一个bin目录,并将其永久添加到PATH中。

要永久添加到PATH,通常需要在〜/ .bash_profile文件中添加一行。 .bash_profile是一个脚本,每次bash启动时都会执行,因此它成为永久更改。

#确保使用>>而不是> !!! #您不想删除现有的.bash_profileecho' export PATH = / home / username / bin:$ PATH' >> 〜/ .bash_profile

我知道这很烦人,但这不是Windows使用.exe的约定-通常程序在Linux中没有任何后缀,因此您必须明确地说它们是可运行的,而不仅仅是随机的个字节。

-rwxr-xr-x 1根root 0 Nov 25 21:55可执行文件-rw-r--r-- 1根root 30 Nov 25 21:54 script.shdrwxr-xr-x 2根root 4096 Nov 25 21:55子目录

第一个字母仅表示文件类型-通常是目录d或普通文件-

然后是神秘的rwxrwxrwx。这表示读取,写入,执行权限,对用户,组和所有人重复3次。通常,您只关心前3个字母-您自己用户的权限。

因此,例如,-rwxr-xr--表示一个普通文件,您自己的用户可以执行任何操作,组中的其他用户只能读取或执行,其他所有人只能读取。

chmod + x script.sh意味着"允许我和其他所有人执行该脚本"或使其可运行。

您也可以使用chown更改文件所有权,并且有更多聪明的方法来使用chmod,但是我们将其作为练习留给您。

还有另一种执行Shell脚本的方法-除了在新进程中运行它们之外,您还可以指示当前的Shell进程逐行读取这些脚本文件并像键入它们一样运行它们。这可以通过2种等效方法之一完成:

因此,如果您在外壳程序脚本中看到一个神秘的圆点,请知道这是它的作用。通常这样做是为了在您当前的shell会话中设置变量-例如为您更改PATH。如果您将脚本作为新进程运行,则将无法更改您的变量。

Shell脚本(和.py脚本等)实际上不是可运行的程序-它们只是文本。他们需要一个解释器程序来读取它们,并确定要在CPU上运行的实际机器代码。

因此,当您运行script.py other args时,实际执行的是python script.py other args。这是通过猜测基于.py后缀的Python解释器来完成的。

Shebangs使这个猜测变得明确,通常是没有必要的。但这就是脚本文件以单行#!/ bin / sh或#!/ usr / bin / python3开头的含义。在第二个示例中,它明确指示使用Python 3而不是2。

几乎总是可以使用操作系统发行版的程序包管理器来下载安全版本,然后可以在方便时随发行新版本轻松升级。这是常见的p列表

......