有没有类似功能的unix shell?

18 unix shell

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

我很想做这样的事情:

$ [ git clone $host/$repo for repo in repo1 repo2 repo3 ]
Run Code Online (Sandbox Code Playgroud)

有没有具有这些功能的 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 $(for f in ${files[*]}; do basename $f; done))

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

$ cp [ os.path.join('dist', os.path.basename(file)) for file in FILES ] 'dist'

你能看到差别吗 ?这就是我要说的。如何不能退出带有这些内置东西的外壳?在 shell 中处理列表真的很痛苦,即使它是一项如此常见的任务:文件列表、PID 列表、所有内容列表。

还有一个非常非常重要的一点:使用大家都知道的语法/工具/功能:sh 和 python。

IPython 接缝朝着好的方向发展,但它很臃肿:如果 var name 以 '$' 开头,它会这样做,如果 '$$' 它会这样做。它的语法不是“自然的”,有很多规则和“解决方法”([ ln.upper() for ln in !ls ] --> 语法错误)

Kei*_*son 10

有一个Scheme Shell可能非常接近您正在寻找的内容。我自己没用过。

更新 :

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

echo hello
Run Code Online (Sandbox Code Playgroud)

语法似乎是

(run (echo hello))
Run Code Online (Sandbox Code Playgroud)

谷歌搜索花了几分钟才找到。这里的第一个例子是:

gunzip < paper.tex.gz | detex | spell | lpr -Ppulp &
Run Code Online (Sandbox Code Playgroud)

这意味着:

(& (| (gunzip) (detex) (spell) (lpr -Ppulp)) (< paper.tex.gz))
Run Code Online (Sandbox Code Playgroud)

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

这个常见问题条目说:

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

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

为了缓解这些问题,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

所以也许这就是真正的答案。


nic*_*ier 9

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

其次,在帮助你编写更多功能标准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
Run Code Online (Sandbox Code Playgroud)

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

这是对 shell 中 fp 的巨大提升。

可以在 shell 中以更 fp 的风格表达很多东西,只是没有想象的那么容易。尽管我们都经常使用它们,但似乎对制作更好的外壳没有太大兴趣。


jwo*_*der 6

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

for repo in repo1 repo2 repo3 ; do git clone $host/$repo ; done
Run Code Online (Sandbox Code Playgroud)

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

git clone $host/{repo1,repo2,repo3}
Run Code Online (Sandbox Code Playgroud)

  • `git clone $host/{repo1,repo2,repo3}` 与 `for` 循环做的事情不同;它使用三个参数调用一次 `git clone`。本质上做同样的事情是`git clone` 工作方式的产物;它不一定适用于其他命令。(例如,比较 `echo foo bar baz` 和 `echo foo; echo bar; echo baz`。) (8认同)