シリアルアダプタ(pyserial、screen、またはminicom)を介してLinuxデバイスに接続して設定を変更する方法(長いstty
コマンドを入力すると改行されます(特に空白とキャリッジリターンを入力))、私はこの分野の知識が不足していますだから初心者ともいえませんが、行を読むツールやシェルインタプリタが改行しているのではないでしょうか?
同様にstty
、サイズを変更しても60 100
改行が発生する点はまったく変わりません。
シェル情報:
root@4020-1-00007:~# echo $SHELL
/bin/sh
root@4020-1-00007:~# ls -al /bin/sh
lrwxrwxrwx 1 root root 9 Jul 31 18:09 /bin/sh -> /bin/bash
root@4020-1-00007:~# bash --version
GNU bash, version 4.3.0(1)-release (arm-angstrom-linux-gnueabi)
Copyright (C) 2013 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software; you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
(どのビルドオプションが選択されているかをどのように知ることができるかわかりません)
答え1
シェルと端末の両方が関連しています。使用するほとんどの端末は自動的に行を置き換えます。起動時にbash(inlib/readline/terminal.c)これに関連する2つのtermcapフラグを確認してください。
_rl_term_autowrap = tgetflag ("am") && tgetflag ("xn");
そのうち(参考用語情報(5))は、端末がVT100(および関連端末)に対して特別な方法で行をラップするかどうかを示します。
auto_right_margin am am terminal has automatic
margins
eat_newline_glitch xenl xn newline ignored
after 80 cols (concept)
これはLinuxコンソールとxtermの場合です。 Bashがこれを確認すると、表示されているようにカーソルが右マージンにあるかどうかを判断するとき(ラップの欠陥を防ぐため)、ラップに役立ちます。ディスプレイ.c:
/* If we're at the right edge of a terminal that supports xn, we're
ready to wrap around, so do so. This fixes problems with knowing
the exact cursor position and cut-and-paste with certain terminal
emulators. In this calculation, TEMP is the physical screen
position of the cursor. */
同時に、端末は次の状況でデフォルトでラップされます。それ右マージンに達します。stty
端末に100列がなく、端末に何を指示したのかわからない場合は、stty
端末のサイズを100列に増やすことはできません。 bashは知っています(または環境変数を設定しない限り知っておく必要がありますCOLUMNS
)。
しかし、ターミナルウィンドウに実際に100の列があると仮定すると...
bash が行の長さについて混乱すると、OP の説明と一致する方法で誤動作します。
最も簡単な例は、シリアル接続を開き、ラインがいっぱいになるまでいくつかのキーを入力することです。これによりラインが損傷します。次の行から続けるか、同じ前の行から続行してください。。
これはいくつかのバグレポートのトピックでした。バッシュFAQしかし、言及された唯一の側面は、プロンプトで印刷できない文字の問題です。
コメントすると、このような関連性があると思います。「Linuxデバイスを通過TVシリーズアダプター」Usedは端末の幅をシェルに確実に知らせることができないため、デフォルトは80列です。
busyboxの説明は、その後の編集で実際のシェルがbashであることを示しているので、ターゲットから外れたようです。しかし、「シリアルアダプタ」の説明は、ウィンドウサイズイベントをシェルに渡さないことを意味します。 Bashのソースコードを読むと、この場合は最初の初期化でのみ有用な画面サイズしか得られないようです(Bashは_rl_get_screen_size最初またはaに応じてSIGWINCH
)。
しかし、あなたはできる実際の画面サイズで端末記述を生成し、それをサブシェルで使用します(bashはシステムが正しい画面サイズを提供できない場合にこの説明を使用します)。
#!/bin/sh
infocmp -1 | \
sed -e 's/^[^[:space:]].*|/fixed|/' \
-e '/lines#/d' \
-e '/cols#/d' \
>foo
resize -u | awk '
/COLUMNS=/{ sub("COLUMNS=","cols#"); }
/LINES=/{ sub("LINES=","lines#"); }
/export/{ next; }
{ sub(";",","); printf "\t%s\n", $0; }
' >>foo
tic foo
TERM=fixedsize bash