ars*_*nal 4 unix bash shell plink
下面是我尝试使用执行我的shell脚本PLINK在MachineB从MachineA(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 调用文件,但这可能会引入其他问题.)
| 归档时间: |
|
| 查看次数: |
26903 次 |
| 最近记录: |