tty

TTY とは Tele-TYpewriter の略。

TTYとは、キーボードとロール紙プリンターなどから構成され、シリアル回線を通じて大型のホストコンピューターに接続し、ホストコンピューターへ文字を入力したり、あるいはホストコンピューターからの出力を印字したりする装置のことである。

これが転じて、TTYは、RS-232Cなどのシリアルインターフェースでコンピューターに接続するコンソール入力装置を指すようになった。現在ではコンソールが用いられることもなくなったが、UNIXの仮想的なキャラクター端末のデバイス名として用いられるなどの形で今も名残をとどめている。

via. TTYとは何? Weblio辞書

ttyは制御端末(controlling terminal)のことです。

linuxにログインするとシェルが起動するところまではご存じですね。シェルは、bash, csh いろいろあります。$ のプロンプトだったら、bash です。

このプロンプトでttyと打つと、ttyと表示され、更にenterを打つと、/dev/pts/0 や /dev/ttyS0 とか表示されます。これらが、制御端末に割り当てられた端末で、前者の例がネット経由、後者の例がシリアル接続で数字は異なることもあります。

表示が /dev/pts/0 だったとして話しを進めます。

シェルの動作は、/dev/pts/0に接続されたキーボードから一文字読み、/dev/pts/0に接続されたコンソールに一文字出力し、文字がenterだったらコマンドとして解釈をはじめ、正常出力もしくは、エラー出力を/dev/pts/0のコンソールに送ります。しかしながら、シェルのプログラム自体に/dev/pts/0とか書いていたらシリアル接続したら入出力できません。そこで、制御端末を指す/dev/ttyをファイルシステムに設けました。

プログラムは、この/dev/ttyをオープンすれば、入出力でき、汎用的になります。

via. linuxでよく出てくるttyとはなんですか? - Quora

tty コマンドをうってみる。

$ docker run -it --rm alpine tty
/dev/pts/0

macOS で打ってみる。端末の数に応じて連番が振られていた。

$ tty
/dev/ttys002

GitHub Actions: Not a tty

tty化するハック

ややハッキーに見えるけど下記のshell設定を加えればtty化できる。

jobs:
  build:
    runs-on: ubuntu-latest

    steps:
      - uses: actions/checkout@v2

      - name: Run a multi-line script
        shell: 'script -q -e -c "bash {0}"'
        run: |
          perl -E 'say "Is STDOUT a TTY?: ", -t STDOUT ? "yes" : "no"'

via. gfx/example-github-actions-with-tty: A demo repository to prepare TTY for GitHub Actions step scripts

下記のPRでこのテクニックを使った。

Pull Request #138 · toshimaru/nyan

やりたかったこととしてはカラー出力されたアウトプットをGitHub Actionsのログ上で得たかった。