🤬

Ruby - Terminate Batch Job (Y/N)?を消したかっただけ

2021/11/14に公開

始めに

Terminate batch job (Y/N)? Terminate batch job (Y/N)? Terminate batch job (Y/N)?
Terminate batch job (Y/N)? Terminate batch job (Y/N)? Terminate batch job (Y/N)?

Terminate batch job (Y/N)?、うるさいですよね。
それを何とかしたかっただけです。

プロンプトはどこから?

Terminate batch job (Y/N)?はbatを終了するときに出てくるプロンプトです。Gemで追加されるコマンドはbatが使われているので出てきています。

batの終了時のTerminate batch job (Y/N)?が出てきただけなのですが、bundle execなどを使うとbat内でbatを起動するような状況になり、プロンプトが沢山出てきています(多分)。

batを置き換える

rufo.bat
@ECHO OFF
@"%~dp0ruby.exe" "%~dpn0" %*

シンプル!!!
これをexeにします。(Go触ったことないのでこれが一番時間かかりました)

runner.go
package main

import (
	"os"
	"os/exec"
	"os/signal"
	"path"
	"strings"
	"syscall"
)

func main() {
	executable, _ := os.Executable()
	executable = strings.Replace(executable, "\\", "/", -1)
	trap := make(chan os.Signal, 1)
	signal.Notify(trap, syscall.SIGTERM, syscall.SIGHUP, syscall.SIGINT)
	go func() {
		<-trap
		// Do nothing
	}()
	args := os.Args
	base := executable[:len(executable)-4]
	args[0] = base
	directory := path.Dir(base)
	cmd := exec.Command(directory+"/ruby.exe", args...)
	cmd.Stdout = os.Stdout
	cmd.Stderr = os.Stderr
	cmd.Stdin = os.Stdin
	cmd.Run()
}

Copilotにも手伝って貰いました。

これをRuby30/binに配置して実行!!!

戦いは続く
戦いは続く
なぜか残っています。

戦いは続く

元のbatを消してみたりなど色々している間に原因を発見しました。

C:\develop\Ruby30\lib\ruby\gems\3.0.0\bin
C:\develop\Ruby30\lib\ruby\gems\3.0.0\bin
こっちでのbatが残っていたようです。これも置き換えて実行!!!
やったぜ
完全勝利

そして

これを良い感じにして公開しました。(他環境での動作未検証)

https://github.com/sevenc-nanashi/no_tbj

最後に

Terminate batch job (Y/N)?なしの 快適なrubygemsライフを!

Discussion