有没有类似功能的unix shell?


19

我(实际上)是函数式编程的新手(实际上只使用python与它联系),但对于shell环境中的一些列表密集型任务来说似乎是一个很好的方法。

我喜欢做这样的事情:

$ [ git clone $host/$repo for repo in repo1 repo2 repo3 ]

是否有任何具有这些功能的Unix shell?或者也许是一些功能允许在python中轻松访问shell(命令,env / vars,readline等等)(想法是使用python的交互式解释器作为bash的替代)。

编辑:

也许一个比较例子会澄清。假设我有一个由dir / file组成的列表:

$ FILES=( build/project.rpm build/project.src.rpm )

我想做一个非常简单的任务:将所有文件复制到dist /并将其安装在系统中(它是构建过程的一部分):

使用bash:

$ cp $ {files [*]} dist /
$ cd dist && rpm -Uvh $(对于$ {files [*]}中的f;执行basename $ f; done))

使用“pythonic shell”方法(注意:这是虚代码):

文件中的$ cp [os.path.join('dist',os.path.basename(file))]'dist'

你能看到区别么 ?这就是我在说什么。怎么不能用内置这些东西退出shell呢?处理shell中的列表真的很痛苦,即使它是一个如此常见的任务:文件列表,PID列表,所有内容列表。

一个非常非常重要的观点:使用语法/工具/功能,每个人都已经知道:sh和python。

IPython接缝处于一个良好的方向,但它是臃肿的:如果var名称以'$'开头,它会这样做,如果'$$'就是这样做的话。它的语法不是“自然的”,所以很多规则和“变通方法”([ ln.upper() for ln in !ls ] - >语法错误)




4
对函数式编程有一点列表理解。如果您主要关注的是编写功能代码,我不会以python为例。
pqnet 2014年

Answers:


10

有一个方案外壳可能非常接近你正在寻找的东西。我自己没有用过它。

更新:

我刚安装并亲自尝试过。看起来scsh更像是一个交互式Scheme解释器和脚本语言,而不是一个真正有用的交互式shell。你不能只打字

echo hello

语法似乎是

(run (echo hello))

只需要几分钟的谷歌搜索即可。这里的第一个例子是:

gunzip < paper.tex.gz | detex | spell | lpr -Ppulp &

这意味着:

(& (| (gunzip) (detex) (spell) (lpr -Ppulp)) (< paper.tex.gz))

但这并没有告诉你如何运行一个简单的 shell命令。

此FAQ条目说:

4.6我可以使用scsh作为交互式shell吗?

好吧,从技术上讲,您可以:只需运行“scsh”命令,您将进入一个Scheme 48会话,其中包含所有可用的scsh功能。但是,这绝对不适合交互式工作:没有命令行编辑,没有命令行历史记录,没有文件/函数名称完成,没有简洁的语法等。

为了缓解这些问题,Martin Gasbichler和Eric Knauel编写了Commander S,它在scsh之上运行并提供了一个舒适的交互式环境。它的一个新颖特性是它可以理解许多Unix命令的输出,并允许用户以有用的方式浏览和操作它。有关Commander S的更多信息可以在描述它的文章中找到:http//www.deinprogramm.de/scheme-2005/05-knauel/05-knauel.pdf 有关如何获取和安装Commander S的说明可从scsh网站:http//www.scsh.net/resources/commander-s.html

也许这才是真正的答案。


6

标准的Bourne式炮弹(shbashksh等),已为您提供:

for repo in repo1 repo2 repo3 ; do git clone $host/$repo ; done

(注意之前do和之前需要分号done。)此外,在in bash和其他shell中,如果$repo只在命令中出现一次,你可以写:

git clone $host/{repo1,repo2,repo3}

当然,我确实使用了很多。但是其他的东西,比如lambda函数呢?

8
git clone $host/{repo1,repo2,repo3}不和for循环做同样的事情; 它git clone用三个参数调用一次。实质上相同的事实是如何git clone工作的神器; 它不一定适用于其他命令。(比较echo foo bar bazecho foo; echo bar; echo baz,例如。)
基思汤普森

@caruccio你可以FUN=eval 'git clone '"$host"'$0 用来定义一个lambda用作for repo in repo{1,2,3} ; do $FUN $repo ; done
pqnet 2014年

最大的问题是unix工具通常会产生副作用(比如写入文件),所以你经常无法像想要用函数式语言那样编写它们。
weberc2 2015年

6

在直接回答问题的类别中,有一个ES shell,用作Bash和Zsh等的功能替代品。

其次,在帮助您编写更多功能标准shell的类别中,请考虑学习pipemill技术:

who | while read username 
do
  cat <<EOF | grep $username
nic
mark
norman
keith
EOF
done | while read username
do
  echo "you have an answer on superuser.com" | mail -s "well done" $username
done

第一个while循环是一个函数keep(仅传递来自循环的非空值),第二个是each(仅用于副作用的映射)。

这对炮弹中的fp有很大的推动作用。

可以在shell中以更多fp风格表达许多内容,它并不像它可能那么容易。似乎对制作更好的贝壳没有太大兴趣,即使我们都使用它们这么多。


2

Scheme Shell,scsh,非常好。

正如Keith Thompson指出的那样,它作为交互式外壳并不实用(尽管Commander S看起来像一个有趣的实验)。相反,对于具有所有POSIX绑定有用的上下文,它是一种优秀的编程语言 - 包括您想要调用其他unix应用程序的情况。无论你写得多么整洁,一个超过几十行的shell脚本总会让人感觉像是黑客sh; 相比之下,没有什么能阻止你使用scsh编写重要的程序。

scsh不是很紧凑(简洁是sh族语言的优点和弱点),但它很强大。

因为它对于小型和大型任务来说是有用和实用的,所以scsh是一种很好的方式来处理一个Scheme(尽管如果这恰好是你的目标,你可能会直接去看看这些日子)​​。

函数式语言的优势不仅适用于列表密集型任务(尽管由于它们的历史,它们倾向于将列表作为数据结构) - 一旦你喝完正确的kool,它就是一种非常强大的方式来编写程序 - 援助。

没有任何有意义的意义,sh样式的shell是有用的,而Python只是在边缘意义上具有lambda函数。


2

贝壳必然具有极强的表现力,这意味着你可以用更少的线条,代币等来实现。

我们通常通过为特殊目的设计语言来表达语言,例如像R,枫等的shell或DSL。并且在大多数通用语言(如C,C ++,Java等)中发现相对较少的表达性。

Python,Perl,Ruby等是通用语言,它们以类似于shell,ala duck typing的方式表达更具表现力。所以DSL被焊接到它们身上,ala Sage用于数学。但是对于实际的shell命令来说并不是那么好

由于所有的括号,即使你建立了一个DLS,Scheme也不具有表现力。

然而,像Haskell这样的功能语言具有巨大的表现力和很强的构建DSL的能力。在Haskell上构建shell的有趣努力是乌龟shelly

在实践中,由于Haskell强大但限制性的类型系统,有一个学习曲线和努力工具,但它们显示出相当大的前景。


1

首先,你应该在"${files[@]}"任何地方使用${files[*]}。否则空间会搞砸你。

shell已经非常实用了; 如果你想在文本输出为行列表项,那么grep就是filterxargs就是map,等管道是非常实用的。

shell无疑是最友好的编程环境,但它比Python更适合交互式使用。它具有API和UI完全相同的非常好的功能 - 一次学习。

我不明白为什么你觉得cp [ os.path.join('dist', os.path.basename(file)) for file in FILES ] 'dist'更好cp "${FILES[@]}" dist。后者的打字要少得多。


0

不知道它是“功能性的”,但也有rc,这是scsh论文提到的。它是es的前身。

在Linux Mint(可能是Debian,Ubuntu ......)上你可以尝试一下

sudo apt-get install rc
man rc
rc
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.