unrealMan’s blog

IT関連の奮闘記を備忘録がてら記載していきます!

【Git for Windows】tty/mintty/winptyとは何なのか?【Gitbash】

tty/minttyとは何なのか?

Windows環境で、Linux操作が可能なGitbashでdockerコマンドなどをしようすると以下のようなエラーとなる。

$ docker exec -it unreal_container bash
the input device is not a TTY.  If you are using mintty, try prefixing the command with 'winpty'

何やら、
「入力デバイスはTTYではないよ。minttyを使用しているなら、コマンドの先頭に「winpty」を付けてくれ」
とのこと。

言われた通り、winptyを使用すれば問題なく動くので、.bash_profileにalias設定をしていました。
(補足)
もしくは以下にwinpty経由にしたいコマンドを追加でもOKなようです。

        for name in node ipython php php5 psql python2.7
        do
                case "$(type -p "$name".exe 2>/dev/null)" in
                ''|/usr/bin/*) continue;;
                esac
                alias $name="winpty $name.exe"
        done

なぜこのようなことが起こるのか?
以下が参考になりました。
■参考
GitbashはデフォルトでMinTTYを使用しており、それはGit for Windowsをインストールした際の構成ウィンドウで選択しているとのこと。
何気なくデフォルトでインストールしていましたが、確かに選択した記憶があります。。

ここで「Use MinTTY」を選択すると、Bashプロンプトは、Windowsに同梱されているCMDコンソールではなく、MinTTYターミナルエミュレーターでホストされます。MinTTYターミナルエミュレータは、コマンドの前にwinptyを付けない限り、Windowsコンソールプログラムと互換性がありません

https://willi.am/blog/2016/08/08/docker-for-windows-interactive-sessions-in-mintty-git-bash/
winptyとは?

MinTTYは、Windows APIを使用するプログラムと対話する場合、ptyの非互換性/文字エンコードの非互換性の問題からうまく動作しないらしく、回避策としてwinptyというラッパーを使うように推奨しているようです。
また、これはMinTTYの問題ではないとのこと。
https://github.com/mintty/mintty/wiki/Tips#inputoutput-interaction-with-alien-programs


また、もしWindows10デフォルトのコンソールに戻りたければ、Git for Windowsインストーラを再実行して選択しなおす。
どうしてもMinTTYを使いたい場合は、インタラクティブセッションでは先頭にwinptyをつけましょうということです。

そもそもtty/minttyとは何なのか?

ttyとは?

“tty”はもともとは “テレタイプ”を意味し、 “pty”は “擬似テレタイプ”を意味します。

https://codeday.me/jp/qa/20181203/23640.html

⇒ttyは端末、ptyは仮想端末(そこに読み書きするプロセスの端末のように機能するが、他のものによって管理されるデバイスエントリ)

コンソール上で、ttyコマンドを打つと自分のデバイスファイル名が表示されます。
(接続している人の名札のようなもの)

unrealman@STN-XXXXX MINGW64 ~/dev/docker (master)
$ tty
/dev/pty0

さらにセッションを立ち上げてttyを入力すると違うデバイスファイル名が表示されます。
(セッションごとにデバイスファイル名が生成される)

unrealman@STN-XXXXX MINGW64 ~/dev/docker (master)
$ tty
/dev/pty1

また、「/dev/pty0」が割り当てられている端末側から、

$ echo "hogehoge" > /dev/pty1

を実行すると、「/dev/pty1」が割り当てられている端末に"hogehoge"と表示されます。

つまり、どの端末から実行されているかを表している情報ということでよさそうです。

MinTTYとは?

Git for Windowsのインストール画面を参考。

ターミナルエミュレータ
それはサイズが変更可能なウインドウで、非長方形の選択、Unicodeをサポートしている。Windowsコンソール・プログラムは(対話型のPythonのような)MinTTYの中で動作させるために「winpty」を通して起動しなければならない。

結論

ttyは端末を持っていることを示し、コマンドの受け手は標準に対する統制(キーボードを介しての入力)があると期待しているのに、MinTTY(仮想端末)を使用することでptyとなり異常検知され警告されているということでしょうか?
上手く整理できていませんので、またアップデートします。
■参考
https://codeday.me/jp/qa/20190802/1364237.html
https://codeday.me/jp/qa/20190112/131467.html