将内联参数传递给在 HDFS 上执行的 shell 脚本

将内联参数传递给在 HDFS 上执行的 shell 脚本

我正在运行存储在 HDFS 上的 shell 脚本(以便我的 oozie 工作流程可以识别它)。运行我正在使用的这个脚本

hadoop fs -cat script.sh |exec sh  

但是我需要将内联参数传递给脚本。在 CLI 上我只需这样做

./script.sh arg1

然后用 $1 回显变量。我试图弄清楚如何对存储在 HDFS 中的脚本执行相同的操作

答案1

sh可以执行从其标准输入流读取的任何脚本sh -s。但是,标准输入流将用于读取脚本,因此需要标准输入输入的用户交互将无法按预期工作,脚本也无法从其标准输入流读取其他数据。

在您的情况下,该hadoop命令提供脚本,您可以使用 执行它sh -s。添加要传递到sh -sshell 的任何命令行选项。在下面的代码中,包装器脚本的命令行参数按原样传递给调用的脚本:

#!/bin/sh

hadoop fs -cat script.sh | sh -s "$@"

请注意,使用execto invokesh -s是不必要的,因为管道的每个部分都在子 shell 中运行。

答案2

您可以尝试类似以下的操作;它使用单独调用 hadoop fs cat(在进程替换中)来检索每个文件并将其作为文件名提供给 script.sh 以打开以供读取。

 # Adjust the hdfs: URLs as necessary
 hadoop fs -cat hdfs://path_to_script/sample.sh | exec bash  \
  <(hadoop fs -cat hdfs://param1) \
  <(hadoop fs -cat hdfs://param2) \
  <(hadoop fs -cat hdfs://param3) \
  <(hadoop fs -cat hdfs://param4)

如果 script.sh 已经知道如何从 hdfs 读取,那么

  hadoop fs -cat hdfs://path_to_script/script.sh | exec bash -s param1 param2 param3 param4

可能就足够了。 -s 选项告诉 bash 从标准输入读取脚本,这样它就不会将 param1 误认为是要运行的脚本的名称。

相关内容