我正在运行存储在 HDFS 上的 shell 脚本(以便我的 oozie 工作流程可以识别它)。运行我正在使用的这个脚本
hadoop fs -cat script.sh |exec sh
但是我需要将内联参数传递给脚本。在 CLI 上我只需这样做
./script.sh arg1
然后用 $1 回显变量。我试图弄清楚如何对存储在 HDFS 中的脚本执行相同的操作
答案1
sh
可以执行从其标准输入流读取的任何脚本sh -s
。但是,标准输入流将用于读取脚本,因此需要标准输入输入的用户交互将无法按预期工作,脚本也无法从其标准输入流读取其他数据。
在您的情况下,该hadoop
命令提供脚本,您可以使用 执行它sh -s
。添加要传递到sh -s
shell 的任何命令行选项。在下面的代码中,包装器脚本的命令行参数按原样传递给调用的脚本:
#!/bin/sh
hadoop fs -cat script.sh | sh -s "$@"
请注意,使用exec
to 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 误认为是要运行的脚本的名称。