我(真的)是函数式编程的新手(实际上只使用 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
所以也许这就是真正的答案。
在直接回答问题的类别中,有旨在作为 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 的风格表达很多东西,只是没有想象的那么容易。尽管我们都经常使用它们,但似乎对制作更好的外壳没有太大兴趣。
标准的Bourne式炮弹(sh
,bash
,ksh
等),已为您提供:
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)
归档时间: |
|
查看次数: |
5261 次 |
最近记录: |