重定向程序输出而不更改目录

时间:2012-05-15 08:33:01

标签: linux bash scripting

问题

我正在编写一组脚本来帮助在群集上执行自动批处理作业。 我具体的是$OUTPUT_DIR和任意$COMMAND 我想执行$COMMAND,使其输出结束于$OUTPUT_DIR。 例如,如果COMMAND='cp ./foo ./bar; mv ./bar ./baz',我想运行它,使得最终结果等同于cp ./foo ./$OUTPUT_DIR/baz。 理想情况下,解决方案看起来像eval PWD="./$OUTPUT_DIR" $COMMAND,但这不起作用。

已知解决方案

[和他们的问题]

  • 编辑$COMMAND:在大多数情况下,命令将是脚本或已编译的C或FORTRAN可执行文件。改变这些内部结构不是一种选择。
  • unionfs,aufs等:虽然这基本上是完美的,但是运行它的用户将没有root,导致成千上万的任意挂载似乎是一个值得怀疑的选择。
  • 复制/硬/软链接:这可能是我必须使用的解决方案:实际上将./的整个内容复制到./$OUTPUT_DIR
  • cd $OUTPUT_DIR; ../$COMMAND:如果$COMMAND读取文件
  • ,则失败
  • pipes:仅当$COMMAND不直接使用文件时才有效;它通常会做什么

我还缺少另一种解决方案,或者这个请求实际上是不可能的?

[编辑:]选择解决方案

我将使用某些内容将目录中的每个对象符号链接到输出目录中,然后从那里运行命令。 这有创建大量符号链接的缺点,但它不应该太糟糕。

2 个答案:

答案 0 :(得分:2)

如果不对$COMMAND的界面做出一些假设,就无法解决这个问题。 “$OUTPUT_DIR”中的输出结果没有单一的定义。对于一个程序,这可能是一些文件,但另一个程序可能只是打印到stdout的东西,而另一个程序可能尝试使用某些协议通过互联网发送一些数据或在GUI中显示某些内容并且没有明显的方法来映射所有这些要“输出到$OUTPUT_DIR”。

因此,您需要发明一些假设并要求任何$COMMAND实现来遵循它们。然后,它可能变得简单到请求命令接受诸如--target=<DIR>的参数。如果您的命令是一个简单的命令,则必须在其周围创建一个包装器脚本,以将该参数转换为应用程序接受的内容。 cpmv以及一些其他工具已经接受参数--target,因此这可能是一个很好的起点。

答案 1 :(得分:2)

您无法设置输出目录,只能设置工作目录。

问题是,一旦设置了工作目录,其他引用就会无效。例如,在您的代码中foo

cp ./foo ./bar

如果您有特定的命令,则有变通方法(创建一个更改参数的脚本,将目录添加到特定参数之前),但通常这是不可能的。