2022/02/28(月)MSYS2のセットアップメモ
投稿日:
確認環境
msys2-x86_64-20260322
セットアップ
MSYS2から落としてインストールする。
pacman -Syuu
入れとくと便利なものたち
pacman
2023以前の古いMSYS2ではpacman -sS パッケージ名を毎回入れないとインストールできないケースがあるかもしれない。
pacman -S --noconfirm unzip
pacman -S --noconfirm diffutils
pacman -S --noconfirm openssh
pacman -S --noconfirm patch
pacman -S --noconfirm perl
pacman -S --noconfirm zsh
pacman -S --noconfirm git
pacman -Sy --noconfirm openbsd-netcat
# prompt用に退避させる
mv /usr/bin/git /usr/bin/msys2_git
バイナリ追加
- jq
- MSYS2のパッケージとして入れず、chocoから入れる
- dig v9.16.50
\usr\local\binに.exeと.dllを全部入れる- Windowsサポートは9.16系までしかない
dotfileの設定
呼び出しを簡略化する
毎回こんな感じで呼ぶのは面倒なので簡略化する。
C:/env/msys64/msys2_shell.cmd -defterm -here -use-full-path -no-start -msys -shell zsh
C:/env/msys64/run_zsh.cmdのようなファイルを作り、以下の内容を書くことでC:/env/msys64/run_zsh.cmd '/c/path/to/hoge.sh'のようにしてシェルスクリプトを実行できるようになる。
@echo off
set MSYSTEM=MSYS
set MSYS2_PATH_TYPE=inherit
set CHERE_INVOKING=1
C:\env\msys64\usr\bin\zsh.exe -l %*
外部連携
呼び出しを簡略化している前提
VSCode連携
{
"terminal.integrated.defaultProfile.windows": "MSYS2",
"terminal.integrated.profiles.windows": {
"MSYS2": {
"overrideName": true,
"path": ["C:\\env\\msys64\\run_zsh.cmd"]
}
}
}
Windows Terminal連携
{
"defaultProfile": "{17da3cac-b318-431e-8a3e-7fcdefe6d114}",
"profiles": {
"defaults": {},
"list": [
{
"commandline": "C:/env/msys64/run_zsh.cmd",
"font": {
"face": "Consolas",
"size": 11
},
"guid": "{17da3cac-b318-431e-8a3e-7fcdefe6d114}",
"icon": "C:/env/msys64/mingw64.ico",
"name": "MINGW64 / MSYS2",
"colorScheme": "VSCode"
}
]
},
"schemes": [
{
"name": "VSCode",
"background": "#1e1e1e",
"foreground": "#d4d4d4",
"black": "#000000",
"blue": "#2472c8",
"brightBlack": "#666666",
"brightBlue": "#3b8eea",
"brightCyan": "#29b8db",
"brightGreen": "#23d18b",
"brightPurple": "#d670d6",
"brightRed": "#f14c4c",
"brightWhite": "#e5e5e5",
"brightYellow": "#f5f543",
"cyan": "#11a8cd",
"green": "#0dbc79",
"purple": "#bc3fbc",
"red": "#cd3131",
"white": "#e5e5e5",
"yellow": "#e5e510"
}
]
}
msys2_shell.cmdのCLI Optionsの意味合い
msys2_shell.cmdの中身を読んで机上で書いているだけなので実際そう動くのかの検証はしていない。
起動パラメーターについては、:checkparamsラベルの中のループして合致するものがあれば環境変数を立て、既知の環境変数であればmsys2_shiftCounterという変数をインクリメントして、MSYS2用のパラメーターと、ユーザーパラーメーターの教会の切り分けをする実装となっている。これはつまり後続処理でmsys2_shiftCounter個分のパラメーターを読み飛ばし、それ以降のパラメーターを処理するためにある。
-mingw32 | -mingw64 | -ucrt64 | -clang64 | -msys[2]
それぞれで実行環境が変わるが、MSYS2用アプリケーションの開発環境用設定のため、-msysで基本的に問題ない。
内部的には環境変数MSYSTEMに対して、対応する値を設定している。-msysと-msys2は等価。
-defterm | -mintty | -conemu
開くターミナルの指定。
-defterm- 標準ターミナルで開く
- Windows TerminalやVSCodeで開く場合はこれを指定する
-mintty- Minttyが起動する
-conemu- Conemuが起動する
内部的にはシェルを直に蹴るか、minttyやconemuにシェルの起動パラメーターを渡しているかの違いがある。
-here
現在の作業フォルダをカレントディレクトリとして開く。
内部的には環境変数CHERE_INVOKINGに対しenabled_from_argumentsを設定している。
MSYS2公式ではCHERE_INVOKINGには1を設定するそうだが、手元で見た限りenabled_from_argumentsを設定しても動作は変わらなかった。恐らく単純に変数値が設定されているか、そうでないかで処理が分かれていると思われる。
参考までにCHERE_INVOKINGを未設定にするとMSYS2のホーム(~)で起動した。
-where DIRECTORY
指定ディレクトリをカレントディレクトリとして開く。
内部的にはcmdでシェルを起動する前にcdしてるだけ。
-[use-]full-path
Windowsのパスを継承する。
内部的には環境変数MSYS2_PATH_TYPEにinheritを設定している。
-no-start
新窓で開かない。
内部的には指定した場合はシェルが直に起動し、指定しない場合startコマンドでシェルが起動するようになっている。
-shell SHELL
ログインシェルを指定する。
例えば-shell zshならzshがログインシェルになる。未指定の場合、bashがログインシェルになる。これはmsys2_shell.cmdでデフォルト値がbashになっているため。
参考までにmsys2_shell.cmdのset "LOGINSHELL=bash"を書き換えるとアップデート時に上書きされて消えるので、しないほうがいい。
-help | --help | -? | /?
ヘルプの表示。
内部的にはprinthelpラベルに飛んでいる。
トラブルシューティング
zsh-newuser-install: startup files exist, aborting. Use the argument -f if you want to force the function to be run again.と出る
zsh-newuser-install: startup files exist, aborting.
Use the argument -f if you want to force the function to be run again.>
と出る場合の対処方法。
msys64/usr/share/zsh/scripts/newuserというファイルを消せば出なくなる。
2022/02/28(月)Linuxコマンドメモ:特定行範囲を出力
2022/02/25(金)sed:簡単な置換
投稿日:
置換をするためのコマンドだが、PCREは基本使えない(自前でビルドすれば使える)
大抵のケースでPerlを使った方が楽だが、Busybox系のディストリなどで入っていない環境では重宝する。
オプション
-l入力からケツ改行を消す
CLI入力するとケツに改行が入るのでそれを除去できる-p入力行を処理する-eスクリプトを流せるphp -rのようなもの-i[ext]ファイル置換。extに指定があるとバックアップファイルが生えるsed -i.bak -e 's/aaa/bbb/' path/to/file
チートシート
改行を改行コードに変換
コマンドを使う必要がある
入力
cat <<'EOF' | sed ':a;N;$!ba;s/\n/\\n/g'
aaa
bbb
ccc
ddd
EOF
出力
aaa\nbbb\nccc\nddd
コマンドの意味合い
| コマンド | 意味合い |
|---|---|
; |
恐らくコマンドの終わり |
: |
ラベル。今回の:aはラベルa |
N |
入力の次の行をパターンスペースに読み込む |
$ |
最終行にマッチ |
! |
マッチしない(アドレスとコマンドの間に入れる必要がある) |
b |
ラベルに分岐する。baはラベルaに分岐。gotoみたいなもんだと思う |
つまり入力の次の行をパターンスペースに読み込み、最終行にマッチしなければ入力の次の行をパターンスペースに読み込み、マッチすればs/\n/\\n/gが発動するのだと思われる。
2022/02/23(水)nginxでローカル開発環境向けのhttps環境を作る
投稿日:
ローカル環境用の開発ドメインをhttps化する時に使えるやつ
例えばローカル環境に複数のサービスがいて、それぞれをhttps://*.example.com/のようなドメインで管理したい時に使える
確認環境
同じことをすればLinuxとかでも応用できると思う
| Env | Ver |
|---|---|
| nginx | 1.19.8 |
| mkcert | 1.4.3 |
| Windows 10 Pro | 19043.1415 |
手順
- mkcert の導入とワイルドカード証明書の作成
choco install mkcert # mkcertを認証局として登録 mkcert -install # 証明書を作成するドメインを列挙 mkcert example.test *.example.test mv _wildcard.example.com+1.* C:/nginx/conf/.ssl/ nginxの設定に証明書を記載
server { server_name dev.example.com; listen 443 ssl; ssl_certificate ssl/_wildcard.example.com+1.pem; ssl_certificate_key ssl/_wildcard.example.com+1-key.pem; ... }
2022/02/13(日)MSYS2でzshのGitプロンプトを快適に使う方法
投稿日:
MSYS2でzsh使いたくない?使いたいよね?そう、使いたい!
しかしその上で一つ大きな障害があります
MSYS2のzshでプロンプトにGitのブランチを表示させようとすると微妙に上手くいきません
問題
.zshrcを使ってPROMPTに現在のGitブランチの状態を表示させようとするとフリーズするケースがあります
具体的には以下のような設定を書くとターミナルのサイズ変更時にシェルがフリーズします
原因は不明ですがPROMPT='$(git)'だけでフリーズするのでGit for Windowsとの相性がなにか良くないのだと思っています
# git functions
current_git_branch() {
(git branch 2> /dev/null | sed -e '/^[^*]/d' -e 's/* \(.*\)/\1/')
}
parse_git_dirty() {
local DIRTY=$(git status -s | tail -1)
if [[ -n $DIRTY ]]; then
echo "%{$fg_bold[magenta]%})%{$fg_bold[red]%}✗"
else
echo "%{$fg_bold[magenta]%})%{$fg_bold[blue]%}✓"
fi
}
print_git_prompt() {
local FIND_BRANCH=$(git branch 2> /dev/null | tail -1)
if [[ -n $FIND_BRANCH ]]; then
echo "%{$fg_bold[magenta]%}(%{$reset_color%}%{$fg_bold[yellow]%}"$(current_git_branch)$(parse_git_dirty)" %{$reset_color%} "
else
echo ""
fi
}
# setting propmt
PROMPT="
%{$fg_bold[cyan]%}%n%{$reset_color%}%{$fg_bold[blue]%}@%m%{$reset_color%}:%{${fg_bold[green]}%}%~%{$reset_color%}
%(?:%{$fg_bold[green]%}➜:%{$fg_bold[red]%}➜) %{${reset_color}%}"'$(print_git_prompt)'
RPS1="%(?..%{$fg_bold[red]%} [ %? ]%{$reset_color%}) %D - %*"
解決策1
プロンプト表示に使うgitバイナリだけmsys2の物に差し替えると上手くいくようになります
具体的には以下のようにしてGit for Windowsと競合しないようにMSYS2のGitを構成しPROMPT='$(msys2_git)'のように呼び出してやると上手くいきます
pacman -S git
mv /usr/bin/git /usr/bin/msys2_git
課題
- msys2/gitをアップデートするときに毎回リネームをする必要がある
- ここが面倒で脆弱性に繋がる可能性がゼロではない
解決策2
Git for Windowsだけでやる場合の方法です
add-zsh-hook precmdでプロンプトに出したいコマンドを呼び出し、変数の値を書き換えてそれを表示するスタイルでやると上手くいきます
課題
- プロンプトの速度が遅い
- プロンプトする時に一瞬フォーカスが飛ぶ(別プロセルがコールされ一瞬窓ができている気がする