注意:这个技巧适用于所有解释器。例如,#!/usr/bin/env ruby 将按照 PATH 设置的指示,调用您喜欢的 Ruby 版本。总之,如果计划发布所编写的任何 shell 脚本,在第一行中使用 #!/usr/bin/env application 表单,因为它的 “移植性 更强:它将运行用户 在他/她的 PATH 变量中已经配置好的应用程序版本。
清单 2 的其余部分应该比较熟悉,至少对于方法是这样。函数 reveal() 是递归的:
如果为 reveal() 传递一个无效的路径或 “小圆点(.,当前目录)或 “两个小圆点(..,父目录),那么递归将结束。
否则,如果参数 filedir 是一个文件,代码将输出其名称并返回,并再一次停止进一步的递归。函数 filename() 可以接受一到两个参数。如果只有一个参数,或者第二个参数为 false,那么将忽略扩展文件名。如果提供 true 作为第二个参数,将返回完整的文件名。
如果参数是一个目录,代码将输出其名称,然后扫描内容(不需要执行深度优先处理,因为目录内容并没有按特定的顺序排列。下一个示例将改进输出)。
需要注意一点:由于对 reveal() 的调用是同一个函数中的最后一条语句,Squirrel 虚拟机(VM)— 运行脚本代码的引擎 — 可以通过称为尾递归(tail recursion)的技术将递归改为迭代。实际上,尾递归消除了对递归使用调用栈的需要;因此,可以实现任意深度的递归并且可以避免栈溢出。
Squirrel 的语法相当简单,因此使用这种语言编写代码非常快捷,特别是如果您曾经使用过 C、C++ 或任何更高级的语言编写过代码的话,这一点则体现得更充分。
最妙的是,这个 shell 代码是可移植的。将它转移到 Windows 机器上,在其上安装 Squirrel Shell,然后就可以运行您的代码。
标签: