sh:...:在尝试使用plink调用shell脚本时不是标识符

时间:2012-07-27 18:16:17

标签: bash shell unix plink

以下是我尝试使用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}}

2 个答案:

答案 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上