以下是我尝试使用PLINK
MachineB
MachineA
从#!/bin/bash
export HIVE_OPTS="$HIVE_OPTS -hiveconf mapred.job.queue.name=hdmi-technology"
hive -S -e 'SELECT count(*) from testingtable1' > attachment22.txt
(Windows机器)执行的shell脚本。
plink
我正在使用C:\PLINK>plink uname@MachineB -m test.sh
Using keyboard-interactive authentication.
Password:
Using keyboard-interactive authentication.
Your Kerberos password will expire in 73 days.
执行shell脚本,如下所示
sh: HIVE_OPTS= -hiveconf mapred.job.queue.name=hdmi-technology: is not
an identifier
这是我每次尝试上面运行时总会得到的以下错误。
PLINK
我的shell脚本出了什么问题?还是一些尾随空格?我无法理解。我从Windows机器
运行{{1}}答案 0 :(得分:13)
错误消息上的sh:
前缀表示脚本正由sh
执行,而不是bash
。
bash允许您组合设置变量并将其导出为单个命令:
export foo=bar
sh,或者至少是它的一些旧版本,要求将这两个动作分开:
foo=bar ; export foo
不识别export foo=bar
语法的sh版本会将字符串foo=bar
解释为变量名称(并且是非法的名称,因为它不是标识符)。
要么安排脚本由bash执行,要么改变它:
export HIVE_OPTS="$HIVE_OPTS -hiveconf mapred.job.queue.name=hdmi-technology"
到此:
HIVE_OPTS="$HIVE_OPTS -hiveconf mapred.job.queue.name=hdmi-technology"
export HIVE_OPTS
就此而言,由于您在脚本的最开头指的是$HIVE_OPTS
,几乎可以肯定已经导出,因此您可以放弃export
(您还需要避免使用任何其他特定于bash的功能。)
那么为什么系统用sh调用shell呢? #!/bin/bash
syntax特定于类Unix系统。 Windows通常决定如何根据文件扩展名执行脚本;显然,您的系统配置为使用sh调用*.sh
个文件。 (您可以使用文件夹选项配置您的系统,使用bash调用*.sh
文件,但这可能会引入其他问题。)
答案 1 :(得分:2)
我认为-m
的{{1}}选项用于读取要从本地文件在远程计算机上执行的命令。如果我对行结尾的评论不起作用,请尝试
plink
通过运行
确保plink uname@MachineB test.sh
可执行
test.sh
在MachineB上。