Unix相当于PowerShell?


21

当复杂的shell命令涉及使用AWK解析文本输出时,我总是觉得很尴尬。基本上,我们将结构化数据转换为文本,然后再次解析文本以获取结构化数据。

PowerShell是Windows外壳程序,它允许您在外壳程序命令之间而不是文本之间通过管道输入类型的对象,从而避免了该问题。

是否有像PowerShell这样基于对象而不是基于文本的Unix shell?

Answers:


24

不,这是另一回事。没有汤匙^ H ^ H ^ H结构化数据。只有文字。

Unix哲学的很大一部分是基于输出文本并接受文本作为输入的思想。您可能需要考虑阅读“ Unix编程的艺术 ”,其中对此有很好的解释。

不要误会我的意思:我了解您的意思,也知道您要达到的目的。诸如Ruby和Python的交互式解释器之类的东西可以用作外壳,但它们对基本任务的友好程度不如Bash。例如,尝试更改目录。

而且,在外壳中使用对象还不是全部。如果只有您的shell支持这一点,那么在Unix上,您将无所适从。所有标准的Unix文本操作工具都必须更改,例如grep,awk,sed等。

我认为几年前就曾尝试创建类似的东西,但是我记不清这个名字,而且很长一段时间都没有听说过。它可能不会起飞。


2
有趣的是,用数据对象流替换文本流(或实际上是字节流)不会违反本书中阐述的一般原则。甚至在“代表规则”下似乎发挥得更好。只是unix选择了文本流作为程序之间的接口。
Wim Coenen

1
但是,“数据对象”是指实际的Python / Ruby / C ++对象还是类似C的结构?
wzzrd

3
+1“不要试图弯曲勺子,那是不可能的。相反,只能尝试认识真相……没有勺子。” 它不是文本作为界面,而是数据流作为界面。对象很适合编程,但是有时它们变成了一个小小的监狱,让您全神贯注……
艾利·佩恩

2
zsh> bash。我的看法,但实际上,如果您没有尝试过zsh,则应该
xenoterracide 2010年

2
@WimCoenen,围绕“结构化数据”发布意味着每个人和Tillie姨妈都必须同意“结构化”是什么。甚至像ls(1)。完全没用。
vonbrand


4

有一个项目,其目标与PowerShell相似:Hotwire。它结合了常规sh和python脚本以及窗口/图形环境。您可以看一下。

它基于面向对象的管道,您可以通过包装现有程序或使用Python库来扩展自己的对象。


1
那是我想要记住的项目!最后一次提交:两年前...
wzzrd

4

PowerShell在2016年成为开放源代码。从那时起,它变得越来越多。源代码在GitHub可用,因此许多UNIX类系统的安装包也可用。


1

我认为您可以通过编写一堆解释的(或编译的)脚本,然后在解释器的外壳中调用它们来完成大部分操作,如果需要,它们将返回或保留您的对象,依此类推。

您至少可以使用Ruby,Perl,Python,Haskell(例如,GHCi),JavaScript(例如,node.js),Matlab和其他语言来实现此目的...


管道是对象意味着您可以进行延迟评估等。因此,如果您要沿着管道传递一组文件对象,则可能需要关心名称或修改日期,但是可能要关心内容。您在JSON中传递什么数据?答:这要看情况。如果管道的使用者提取数据,则它可以请求正确的数据。问题解决了。
奈杰尔·索恩

1

三年后的另一个想法:可以使用XML或JSON用文本流表示对象。我更喜欢JSON(更简单),并且确实有一些项目可以提供经典的* NIX实用程序JSON支持。例如:https : //github.com/step-/JSON.awk

对于经典的* NIX程序(如AWK)使用对象类型模型时,一个问题是它们确实不具有OO支持。例如,虽然AWK确实具有关联数组,但这些数组不是多维的(AWK数组中的每个元素必须是数字或字符串; AWK中不允许将数组作为数组对象)。


Clojure提供了edn,可在限制JSON的情况下对各种类型的数据进行序列化/反序列化。
Mario
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.