4

下面是我试图PLINK在(Windows 机器)上使用MachineB的shell 脚本。MachineA

#!/bin/bash
export HIVE_OPTS="$HIVE_OPTS -hiveconf mapred.job.queue.name=hdmi-technology"
hive -S -e 'SELECT count(*) from testingtable1' > attachment22.txt

plink用来执行下面的shell脚本,

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.

这是我在尝试像上面那样运行时总是遇到的以下错误。

sh: HIVE_OPTS= -hiveconf mapred.job.queue.name=hdmi-technology: is not 
an identifier

我的 shell 脚本有问题吗?或一些尾随空格?我无法弄清楚。我正在PLINK从 Windows 机器上运行

4

2 回答 2

14

错误消息上的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语法特定于类 Unix 系统。Windows 通常根据文件扩展名来决定如何执行脚本;显然,您的系统配置为*.sh使用 sh 调用文件。(您可以使用文件夹选项配置您的系统,以*.sh使用 bash 调用文件,但这可能会引入其他问题。)

于 2012-07-27T18:46:12.663 回答
2

我认为-m选项是从本地文件plink读取要在远程机器上执行的命令。如果我对行尾的评论不起作用,请尝试

plink uname@MachineB test.sh

通过运行确保test.sh可执行

chmod +x test.sh

在机器 B 上。

于 2012-07-27T18:30:03.127 回答