4

以下は、 (Windowsマシン)から実行しようとPLINKしているシェルスクリプトです。MachineBMachineA

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

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.

そして、これは、上記のように実行しようとすると常に発生する以下のエラーです。

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

私のシェルスクリプトに何か問題がありますか? またはいくつかの末尾のスペース?私はそれを理解することができません。PLINKWindowsマシンから実行しています

4

2 に答える 2

14

sh:エラー メッセージの接頭辞は、スクリプトがshではなくによって実行されていることを示していbashます。

bash を使用すると、変数の設定とエクスポートを 1 つのコマンドに組み合わせることができます。

export foo=bar

sh、または少なくともその一部の古いバージョンでは、次の 2 つのアクションを分離する必要があります。

foo=bar ; export foo

構文を認識しないバージョンの sh はexport foo=bar、文字列を変数名として解釈します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構文は Unix ライクなシステムに固有のものです。通常、Windows はファイル拡張子に基づいてスクリプトの実行方法を決定します。*.shどうやら、システムはshを使用してファイルを呼び出すように構成されています。(フォルダー オプションを使用して、bash を使用してファイルを呼び出すようにシステムを構成することもできますが、それによって他の問題が発生する可能性があります。)*.sh

于 2012-07-27T18:46:12.663 に答える
2

-mのオプションは、ローカルファイルplinkからリモートマシンで実行するコマンドを読み取ることだと思います。行末に関する私のコメントが機能しない場合は、試してみてください

plink uname@MachineB test.sh

test.sh実行して実行可能であることを確認します

chmod +x test.sh

MachineBで。

于 2012-07-27T18:30:03.127 に答える