禁用bash脚本输入参数替换
Java进程调用Bash脚本,如下所示:禁用bash脚本输入参数替换,bash,shell,sh,Bash,Shell,Sh,Java进程调用Bash脚本,如下所示: ./spark_submit.sh ${SPARK_HOME}/bin/spark-submit --master yarn --deploy-mode cluster --conf spark.yarn.historyServer.address=${hadoopconf-yarn.resourcemanager.hostname}:18080 我必须对输入参数运行操作,所以我检查每个参数并重建原始输入 我通过访问$1值,然后移位,一个接一个地获取
./spark_submit.sh ${SPARK_HOME}/bin/spark-submit --master yarn --deploy-mode cluster --conf spark.yarn.historyServer.address=${hadoopconf-yarn.resourcemanager.hostname}:18080
我必须对输入参数运行操作,所以我检查每个参数并重建原始输入
我通过访问$1值,然后移位,一个接一个地获取参数
我没有找到阻止bash解决问题的方法
${SPARK_HOME}/bin/SPARK提交
到
/bin/spark提交
及
${hadoopconf.resourcemanager.hostname}
到
warn.resourcemanager.hostname
Java进程不能以不同的方式传递参数,例如使用转义斜杠
有什么想法吗 用in'(单引号)传递它。单引号防止扩展
也就是说,类似于:
./spark_submit.sh '${SPARK_HOME}/bin/spark-submit' --master yarn --deploy-mode cluster --conf spark.yarn.historyServer.address='${hadoopconf-yarn.resourcemanager.hostname}:18080'
用in'(单引号)传递它。单引号防止扩展
也就是说,类似于:
./spark_submit.sh '${SPARK_HOME}/bin/spark-submit' --master yarn --deploy-mode cluster --conf spark.yarn.historyServer.address='${hadoopconf-yarn.resourcemanager.hostname}:18080'
只有当shell是shell脚本的父进程,在脚本启动之前将单个字符串分解为参数列表(并对其运行扩展)时,才会出现此问题。这通常发生在使用编程语言模拟C
system()
函数时,该函数接受单个字符串并将其作为参数传递给sh-C'…'
由于该过程发生在脚本启动之前,您无法从脚本内部修复它
将文本参数列表传递到JVM中,您不会遇到这个问题:
列出它如何处理参数;请注意,传入的值是经过审核/审查/控制的,或者(更好!)让人重写它以避免使用eval
。只有在shell脚本的父进程是shell时,才会出现此问题,将单个字符串分解为参数列表(并对其进行扩展)在脚本开始之前。这通常发生在使用编程语言模拟Csystem()
函数时,该函数接受单个字符串并将其作为参数传递给sh-C'…'
由于该过程发生在脚本启动之前,您无法从脚本内部修复它
将文本参数列表传递到JVM中,您不会遇到这个问题:
列出它如何处理参数;请注意,传入的值是经过审核/审查/控制的,或者(更好!)让人重写它以避免使用eval
。我不确定您希望脚本看到什么。如果您希望使用literal${SPARK\u HOME}/bin/SPARK submit
而不是扩展的/bin/SPARK submit
,请将参数括在单引号中。向我们展示脚本的相关部分。如果将echo“$@”放入脚本,脚本的输出是什么;从一开始就退出
?如果打印的不是${SPARK_HOME}…
,而是实际值,那么在脚本启动之前就已经进行了变量扩展,无法解决此问题。我不确定您希望脚本看到什么。如果您希望使用literal${SPARK\u HOME}/bin/SPARK submit
而不是扩展的/bin/SPARK submit
,请将参数括在单引号中。向我们展示脚本的相关部分。如果将echo“$@”放入脚本,脚本的输出是什么;从一开始就退出
?如果打印的不是${SPARK\u HOME}…
,而是实际值,那么在脚本启动之前就已经发生了变量扩展,无法解决这个问题。