現在の問題

現在の問題

次の100行をターミナル(xterm)にコピーして貼り付けて、接続されたサーバーで実行しましたssh

mv /long/path/to/file1 /longer/path/to/file1
mv /long/path/to/file2 /longer/path/to/file2
...
mv /long/path/to/file99 /longer/path/to/file99
mv /long/path/to/file100 /longer/path/to/file100

残念ながら、コピー/貼り付け後に100個のファイルが見つかりません。/longer/path/to/

SSHを介して接続されているサーバーのbash履歴を見ると、最初の20個のコマンドの後にほとんどのコマンドが切り捨てられることがわかります。

mv /long/path/to/file1 /longer/path/to/file1
...
mv /long/path/to/file20 /longer/path/to/file20
mv /long/path/to/fi
mv /long/path/to/fi
mv /long/path/to/file23 /longer/p
mv /long/path/to/file24 /longer/path
mv /long/path/to/file25 /longer/p
mv /long/path/to/file26 /longer/p
mv /long/path/to/file27 /longer/path/t
mv /long/path/to/file28 /longer/path/to/fil
mv /long/path/to/file29 /longer/path/to/fil
mv /long/path/to/file30 /longer/path/to/file
mv /long/path/to/file31 /longer/path/to/file
...

この問題を解決する方法の答えを見つけることができます。

しかし、正確に何が起こっているのかについての説明が見つかりません。特に:

  • これは端末関連の問題ですか(私の場合はXterm)?
  • コピー/貼り付けの発生場所ssh:これは問題を引き起こしたり増幅したりしますか?
  • これはサーバーのbash関連の問題ですか?別のシェルを使用している場合、これは起こらないかもしれませんか?

ベストアンサー1

次のエラーが発生したようです。

https://lkml.org/lkml/2013/7/25/205

ラインルールバッファを超えて4k以上を貼り付けると、readline()が誤ってエラー回復パスをトリガーしました。エラーリカバリパスは、ラインルールバッファがいっぱいになり、標準モードで実行されており、改行文字が受信されない場合は入力を削除します。 readline() はラインを文字ごとに読み取るために termios を非正規モードに変更するため、ラインルールバッファがいっぱいになる可能性があります。です。 Zoneでエラーが発生します。回復。

非キヤノンモードからキヤノンモードにtermioを変更すると、EOFプッシュをシミュレートし、読み取りバッファにデータが含まれます。いいえバッファから DISABLED_CHAR を読み込みます。

readline() の問題に関しては、読み取りバッファを変更せずに termios を非正規モードに戻すことができることが重要です。つまり、以前のtermiosの変更が発生していないように見えます(中間読み取りが発生しない限り)。 )。

これは2013年12月10日、Linuxカーネル3.14としてカーネルに実装されました。以前のLinuxディストリビューションを使用していますか?あなたのディストリビューションは何ですか?おそらく実際のパスをファイルに置き換えたので、文字数を実際に数えることはできません。次のことができます。

for ((a=1; a<20; a++)); do echo "mv /long/path/to/file$a /longer/path/to/file$a"; done|wc -c

実際のルートを使用すると、本当に4Kに近いものになりますか?その場合、上記のエラーはあなたのエラーかもしれません。

もしそうなら、あなたの質問に答えてください。

  • これは端末関連の問題ですか(私の場合はXterm)?

いいえ

  • SSH経由でコピー/貼り付け:これは問題を引き起こしたり増幅したりしますか?

いいえ

  • これはサーバーのbash関連の問題ですか?

いいえ、本当です。これはbashやbashで使用されるライブラリのバグではありません。カーネルにバグが存在します。

  • 別のシェルを使用している場合、これは起こらないかもしれませんか?

おそらく、シェルがreadlineを使用していない場合です。 zshと同じです。

関連質問「複数の犬を貼り付ける方法…」については問題とは関係ないようです。その理由は、一部のアプリケーションが貼り付けたコマンドを読み取ることができるためです。最も有名な例は、リモートサーバーでsshコマンドを実行する場合のsshです。しかし、ラインの一部だけが失われていることを考慮すると、あなたのケースでは不可能です。

2番目の質問「ターミナルに貼り付けるコマンド...」は、2013年9月25日にパッチが存在しなかったときに要求されました。

確実に確認する方法は? uname -aの出力をここに貼り付けます。

おすすめ記事