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

ars*_*nal 4 unix bash shell plink

下面是我尝试使用执行我的shell脚本PLINKMachineBMachineA(Windows计算机).

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

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.
Run Code Online (Sandbox Code Playgroud)

这是我每次尝试运行时总会遇到的以下错误.

sh: HIVE_OPTS= -hiveconf mapred.job.queue.name=hdmi-technology: is not 
an identifier
Run Code Online (Sandbox Code Playgroud)

我的shell脚本出了什么问题?还是一些尾随空格?我无法理解.我PLINK从Windows机器上运行

Kei*_*son 14

sh:错误信息上前缀表明该脚本是由执行sh,而不是bash.

bash允许您组合设置变量并将其导出为单个命令:

export foo=bar
Run Code Online (Sandbox Code Playgroud)

sh,或者至少是它的一些旧版本,需要将这两个动作分开:

foo=bar ; export foo
Run Code Online (Sandbox Code Playgroud)

不识别export foo=bar语法的sh版本会将字符串解释foo=bar为变量名称(并且是非法的名称,因为它不是标识符).

要么安排脚本由bash执行,要么更改:

export HIVE_OPTS="$HIVE_OPTS -hiveconf mapred.job.queue.name=hdmi-technology"
Run Code Online (Sandbox Code Playgroud)

对此:

HIVE_OPTS="$HIVE_OPTS -hiveconf mapred.job.queue.name=hdmi-technology"
export HIVE_OPTS
Run Code Online (Sandbox Code Playgroud)

就此而言,既然你在$HIVE_OPTS脚本的最开头指的是它,它几乎肯定已经被导出了,所以你可以放弃它export.

(您还需要避免使用任何其他特定于bash的功能.)

那么为什么系统用sh调用shell呢?该#!/bin/bash语法是特定的类Unix系统.Windows通常决定如何根据文件扩展名执行脚本; 显然你的系统配置为*.sh使用sh 调用文件.(您可以使用"文件夹选项"配置系统,以*.sh使用bash 调用文件,但这可能会引入其他问题.)

  • 你应该为此开一个新问题,而不是在这里继续. (2认同)