2

在 unixesque (sh/bash/zsh) 系统中是否有标准方法来执行一组脚本,就好像这组脚本是一个脚本一样?(想想index.html)。关键是要避免像您通常会发现的额外帮助脚本,并保持小程序自给自足且更易于​​维护。

假设我有两个(粗体)红宝石脚本。

/bin
/bin/foo_master
/bin/foo_master/ main
/bin/foo_master/ helper.rb

所以现在当我执行foo_master

seo@macbook ~ $ foo_master
[/bin/foo_master/main]:结交新朋友,但保持老朋友。
[/bin/foo_master/helper.rb]:一个是银,一个是金。

4

3 回答 3

1

如果您尝试在不创建帮助脚本的情况下执行此操作,则执行此操作的典型方法是执行两者(注意:我将使用: $;来表示 shell 提示符):

: $; ./main; ./helper.rb

现在,如果您试图将两者的输出捕获到一个文件中,那么您可以将它们分组到一个带有括号的subshel​​l中,并捕获 subshel​​l 的输出,就好像它是一个命令一样,如下所示:

: $; (./main; ./helper.rb) > index.html

这就是你所追求的吗?我有点不清楚你的最终目标是什么。如果你想让这成为一个高度可重复的事情,那么可能会想要创建一个包装器命令......但如果你只想将两个命令作为一个运行,你可以执行上述两个选项之一,它应该可以工作对于大多数情况。(不过,如果我错过了你所追求的,请随意扩展这个问题。)

于 2013-08-23T19:43:14.920 回答
1

我想出了如何以半标准的投诉方式做到这一点。

我在 shell 脚本中使用 eval 语法在运行时对 $PATH 进行 lambda 评估。所以在我的 /etc/.zshrc

$REALPATH = $PATH
$PATH = $REALPATH:`find_paths`

其中 find_paths 是递归搜索 $PATH 目录中的文件夹的函数(下面的伪代码)

($PATH 中的 foreach 路径 => ls -d -- */)



所以我们从这个出发:

seo@macbook $ echo $PATH
/bin/:/usr/bin/

为此,自动:

seo@macbook $ echo $PATH
/bin/:/usr/bin/:/bin/foo_master/

现在我只是将 main 重命名为“foo_master”,瞧!自包含可执行文件,我敢说“应用程序”。

于 2013-08-23T22:46:19.290 回答
0

是的,这很容易!

#!/bin/bash

/bin/foo_master/main
/bin/foo_master/helper.rb

将文件另存为 foo_master.sh 并在 shell 中键入:

seo@macbook ~ $sudo chmod +x foo_master.sh

然后运行类型:

seo@macbook ~ $./foo_master.sh

编辑:

在任何给定目录中提供 index.html 文件的原因是 HTTP 服务器明确地寻找一个。(在服务器配置文件中,您可以指定要在服务器上查找的文件名,例如 index.html 即 index.php index.htm foo.html 等)。因此它并不神奇。在某些时候,“帮助脚本”会显式查找文件。我不认为编写像上面这样的脚本是可以跳过的步骤。

于 2013-08-23T17:59:59.443 回答