首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

用 Python 创建你自己的 Shell

介绍

很多人讨厌bash脚本。每当我要做最简单的事情时,我都必须查阅文档。如何将函数的参数转发给子命令?如何将字符串分配给变量,然后作为命令调用该字符串?如何检查两个字符串变量是否相等?如何分割字符串并获得后半部分?等等。不是我找不到这些答案,而是每次都必须查找它们。

但是,我们不能否认将整个程序当作纯粹的功能发挥作用的能力,以及将一个程序的输出传递到另一个程序的自然程度。因此,我想知道,我们能否将bash的某些功能与Python结合起来?

基础知识

让我们从一个类开始。这是一个简单的方法,将其初始化参数保存到局部变量,然后使用对其自身进行延迟求值并保存结果。

我们让它旋转一下:

使其看起来更像“命令式”

不用每次我们要自定义命令时都去调用PipePy。

相当于

换句话说,我们要使:

相当于

值得庆幸的是,我们的类创建了惰性对象这一事实在很大程度上帮助了我们:

关键字参数

如果要向传递更多参数,则可能会遇到。我们可以轻松地执行。我们可以做得更好吗?

让我们来旋转一下:

Piping

事情开始变得有趣起来。我们的最终目标是能够做到:

我们的过程是:

1、让和方法接受一个仅用于关键字的新关键字参数,该参数将保存在上。

2、在评估期间,如果设置了,它将作为输入参数传递给。

3、重写方法以将左操作数的结果作为输入传递给右操作数。

让我们尝试一下(从之前稍微修改命令以证明它确实有效):

让我们添加一些简单的东西

1、真实性:

现在我们可以作出如下处理:

2、读取/写入文件:

现在可以作出如下操作:

3、迭代

现在可以作出如下操作:

4、表格:

现在可以作出下面操作:

5、普通实用程序:

在子进程中更改工作目录不会影响当前的脚本或python shell。与更改环境变量相同,以下内容不是PipePy的补充,但很不错:

使事情看起来更shell-like

如果我在交互式shell中,则希望能够简单地键入并完成它。

交互式

我们的实例是惰性的,这意味着如果我们对它们的结果感兴趣,则将对它们进行评估,此后不再进行评估。如果我们只是想确保已执行该操作怎么办?例如,假设我们有以下脚本:

该脚本实际上不会执行任何操作,因为调用实际上并未得到评估。我认为一个不错的惯例是,如果不带参数调用强制求值:

因此在编写脚本时,如果要确保实际上已调用命令,则必须用一对括号来调用它:

但是,我们还没有解决问题。考虑一下:

不好!没有改变。对象将其保留在内存中。随后的评估实际上不会调用该命令,而只是返回存储的值。

一种解决方案是通过使用空括号来强制创建副本:

另一个解决方案是:由构造函数返回的实例不应该是惰性的,但由调用返回的实例将是惰性的。

旋转一下:

并且可以预见的是,使用空调用的返回值将具有之前的行为:

没关系 您不会期望会更新其值。

越来越危险

好吧,不错,但是如果我们像人类一样简单地做,那就太好了。嗯,我有个主意:

现在可以作如下操作:

我们还有一步:

现在无济于事:

更危险的事情

用给了我一个灵感。为什么我们必须一直实例化?我们无法在路径中找到所有可执行文件,并根据它们创建实例吗?我们当然可以!

因此,现在,将我们拥有的所有内容都放在一个python文件中,并删除脚本(这是实际bash脚本的转录):

更多阅读

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20210205A01G4B00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券