2022-04-11 tty / GitHub Actions: Not a tty → tty化するハック
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
GitHub Actionsのコマンド実行環境にTTYがない問題、めちゃくちゃコメントついてるけどまだ実装の優先度は低いみたいだ。 / “Not a tty · Issue #241 · actions/runner · GitHub” https://t.co/YxZgreJppS
— FUJI Goro (@__gfx__) December 16, 2020
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"'
下記のPRでこのテクニックを使った。
Pull Request #138 · toshimaru/nyan
やりたかったこととしてはカラー出力されたアウトプットをGitHub Actionsのログ上で得たかった。