2012-07-27 56 views
4

以下是我嘗試使用MachineB上的PLINKMachineA(Windows機器)執行的shell腳本。sh:...:當嘗試使用plink調用shell腳本時不是標識符

#!/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 [email protected] -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腳本有問題嗎?或一些尾隨空格?我無法弄清楚。我從窗機

+0

如果你創建了'你的本地Windows機器上test.sh',你必須確保該文件具有Unix,而不是Windows,行結尾可讓它在遠程Unix主機上正常運行。 – chepner 2012-07-27 18:20:57

+0

謝謝chepner。我怎樣才能確保'test.sh'有unix文件結尾?我使用'Notepad ++'來創建test.sh文件,並且有一個選項可以用unix格式創建它,並且我也採用了同樣的方法。 – ferhan 2012-07-27 18:22:21

+0

嗯。在遠程機器上,您可以嘗試使用'file test.sh',並確保它沒有提及任何有關CRLF行結束符的信息。 – chepner 2012-07-27 18:27:35

回答

13

錯誤消息的sh:前綴表示腳本正在執行sh而不是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殼? #!/bin/bash syntax特定於類Unix系統。 Windows通常決定如何根據文件擴展名來執行腳本;顯然你的系統被配置爲使用sh調用*.sh文件。(您可以配置系統,使用文件夾選項,以調用使用bash *.sh文件,但可能會帶來其他問題。)

+0

感謝Keith,這解決了我以前的問題,但我我得到了新的錯誤,我已經用我的更新後的shell腳本更新了我的問題,如果你能提供更多的建議,那將是非常棒的。 – ferhan 2012-07-27 18:57:24

+2

你應該爲此打開一個新問題,而不是在這裏繼續。 – chepner 2012-07-27 19:11:27

2

運行PLINK我覺得-m選項plink是讀命令從本地文件的遠程機器上執行。如果我對行尾註釋不工作,嘗試

plink [email protected] test.sh 

確保test.sh是可執行machineB上運行

chmod +x test.sh