我正在编写一组脚本来帮助在群集上执行自动批处理作业。
我具体的是$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可执行文件。改变这些内部结构不是一种选择。./
的整个内容复制到./$OUTPUT_DIR
cd $OUTPUT_DIR; ../$COMMAND
:如果$COMMAND
读取文件$COMMAND
不直接使用文件时才有效;它通常会做什么我还缺少另一种解决方案,或者这个请求实际上是不可能的?
我将使用某些内容将目录中的每个对象符号链接到输出目录中,然后从那里运行命令。 这有创建大量符号链接的缺点,但它不应该太糟糕。
答案 0 :(得分:2)
如果不对$COMMAND
的界面做出一些假设,就无法解决这个问题。 “$OUTPUT_DIR
”中的输出结果没有单一的定义。对于一个程序,这可能是一些文件,但另一个程序可能只是打印到stdout的东西,而另一个程序可能尝试使用某些协议通过互联网发送一些数据或在GUI中显示某些内容并且没有明显的方法来映射所有这些要“输出到$OUTPUT_DIR
”。
因此,您需要发明一些假设并要求任何$COMMAND
实现来遵循它们。然后,它可能变得简单到请求命令接受诸如--target=<DIR>
的参数。如果您的命令是一个简单的命令,则必须在其周围创建一个包装器脚本,以将该参数转换为应用程序接受的内容。 cp
,mv
以及一些其他工具已经接受参数--target
,因此这可能是一个很好的起点。
答案 1 :(得分:2)
您无法设置输出目录,只能设置工作目录。
问题是,一旦设置了工作目录,其他引用就会无效。例如,在您的代码中foo
:
cp ./foo ./bar
如果您有特定的命令,则有变通方法(创建一个更改参数的脚本,将目录添加到特定参数之前),但通常这是不可能的。