特定の環境で実行されると、スクリプト出力に不明な末尾の文字があります。

特定の環境で実行されると、スクリプト出力に不明な末尾の文字があります。

私はJavaでAppiumというテストフレームワークを使用する必要があるプロジェクトを進めています。 Appiumライブラリは、NodeJSのインストール場所を確認するために、マイコンピュータで次のスクリプトを実行しようとしました(問題ありません。ノードです)。

#!bin/sh
OUTPUT="$(npm root -g)"
echo "${OUTPUT}"
exit

このスクリプトは、Java JUnit 単体テスト中に bash を使用して明示的に実行されます。バラよりこのリンクAppiumがスクリプトを実行するために使用するコードを見てください。私のシステムのシェルで(zsh、bash、またはshを使用して)このコマンドを実行すると、次の出力が表示されます。

/home/me/node-v8.9.0-linux-x64/lib/node_modules

途方もない。何らかの理由で私のIDE(IntelliJ)で設定した環境で同じスクリプトを実行すると、出力は次のようになります。

/home/me/node-v8.9.0-linux-x64/lib/node_modules

[H[2J

これがAppiumにとって良いアイデアであるかどうかにかかわらず、\r\r\n[H[2J私は通常GnomeDOと呼ばれるプログラムを介してUbuntu MATEでIntelliJを起動します。 IntelliJが期待どおりに動作していることを確認したら、$PATHIntelliJを終了してシェルから始めました。そうです$PATH。後の出力が停止します。

Linuxデスクトップ環境でアプリケーションを起動すると、シェルでアプリケーションを実行するのとどのように異なり、結果として読み取れない文字が発生しますか?

答え1

注:私はコメントでこれらのアイデアと非常に推測的な結論を捉えて理論化してきました。

疑わしく見えるファンキーなキャラクターエスケープシーケンスカーソルを端末の上部(左上?)に移動して画面を消去します。シェルで次のことを行うことで、実際にこれを確認できますecho -e '\e[H\e[2J'

いくつかの検索を行った結果、エスケープシーケンスのサポートが不完全で、問題のシーケンスに[H表示される文字が私たちと同じように見えるGnome端末への参照を見つけました(例:)

これら2つの事実を組み合わせると、次の理論が生まれます。

  1. Intellijは、ウィンドウを整理するためにターミナルウィンドウを開くとき\e[H\e[2J
  2. Gnome DO は、通常使用する端末とは異なる特定の端末タイプを指す環境を設定します。
  3. IntellijがDOで起動したら、このターミナルを起動してエスケープシーケンスを発行してからスクリプトを実行します。

ああ、なぜスクリプト出力の後にエスケープシーケンスが表示されるのですか?これが必ずしもそうという意味ではない。印刷スクリプト出力を印刷した後。 Intellijは他の有効なエスケープシーケンスをエクスポートすることができ、行が順序が間違っているように見えるようにカーソルを移動できます。

これはまた厳しいすべての事実が含まれていないと思いますが、システムが上記のコマンドを処理していないechoGnome端末を見つけることができるかどうかを確認するか、私の推測を確認してください。

関連情報