疑問
「新しいLinuxの教科書」という本でLinux入門をしてみたところ、一部教科書通りにいかず、調べても出てこなかったので、備忘録的なものとして残します。
具体的にはChapter08-04の「exportコマンド」の使用例のところです。
この章では環境変数「LESS」に対して「--no-init」を設定し、lessコマンドの挙動変化を確認する(終了時に画面クリアしていたものが、画面クリアしなくなるようにする)というものなのですが、Hyper-Vから接続し操作をしていたところ、特に設定を変更しなくても画面クリアされない挙動をしており、なぜ教科書通りにならないのかわかりませんでした。
(aliasも確認しましたがlessに対しては設定なし)
なので初学者ですが、できる範囲で何が原因なのか調べてみました。
調べてみた挙動
Linux上での(Hyper-Vからアクセスしたときの)動作(less /etc/crontab→qで終了)
画面がクリアされず、表示内容が残っていることが確認できます。
ターミナルの(TeratermやGUIからターミナルを立ち上げたときの)動作(同上)
Terminalからアクセスした場合は、終了時に画面クリアされていることがわかります。
調べて分かったこと
lessのソースを見てみたところ、「is_tty」がTrueの時は画面クリアするようになっています。この変数は「isatty(1)」が設定され、ドキュメントを見るとターミナルから接続したときは"1"になるようです。lessのソース該当箇所:https://github.com/gwsw/less/blob/e27853c89be227ad7a1a81aefd2942c03bd32dad/main.c#L387-
isattyのマニュアル("1"は標準出力のことを示すようだ):https://linuxjm.osdn.jp/html/LDP_man-pages/man3/isatty.3.html
(2020/04/06:いただいたコメントをもとに確認したところ、確かにisatty(1)はどちらの場合も"1"を返していたため削除。@angel_p_57 さんありがとうございます!) - 環境変数$TERMがログインの仕方によって値が変わることを確認しました。
- Hyper-Vで接続した場合:linux
- GUIからターミナルを起動したり、外部から(teratermで)ログインした場合:xterm
- 上記環境変数TERMを変えてみると、ターミナルでもLinuxっぽい動作になったり、Linux上でもターミナルっぽい動作になったので、
isattyと関連していると思われます。$TERMと連動しているようです。 - $TERMによって切り替える際、「端末情報(infocmp)」に「smcup」「rmcup」があるかどうかで動作が変わるとのことです。
(2020/04/06いただいたコメントをもとに修正。@angel_p_57 さんありがとうございます!)
私的結論
上記教科書はターミナルでの実行を想定しているため、原則としてLinuxに直接アクセスするのではなく、ターミナルで動かしてみるのがよいと思われます。