お知らせ

現在サイトのリニューアル作業中のため、全体的にページの表示が乱れています。

MSYS2

初回セットアップ

pacman -Syuu
# 一回落ちるのでもう一度起動して
pacman -Syuu

入れとくと便利なものたち

pacman

pacman -sS unzip
pacman -S --noconfirm unzip
pacman -sS diffutils
pacman -S --noconfirm diffutils
pacman -sS dnsutils
pacman -S --noconfirm dnsutils
pacman -sS openssh
pacman -S --noconfirm openssh
pacman -sS patch
pacman -S --noconfirm patch
pacman -sS perl
pacman -S --noconfirm perl
pacman -sS zsh
pacman -S --noconfirm zsh
pacman -sS git
pacman -S --noconfirm git
# prompt用に退避させる
mv /usr/bin/git /usr/bin/msys2_git

バイナリ追加

  • jq
    • chocoから入れる
  • dig
    • .x64.zipが入っているバージョンを/usr/binに突っ込む

dotfileの設定

https://github.com/Lycolia/my-dotfiles

Windows Terminal連携

{
  "defaultProfile": "{17da3cac-b318-431e-8a3e-7fcdefe6d114}",
  "profiles": {
    "defaults": {},
    "list": [
      {
        "commandline": "C:/env/msys64/msys2_shell.cmd -defterm -here -use-full-path -no-start -msys -shell zsh",
        "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の意味合い

-mingw32 | -mingw64 | -ucrt64 | -clang64 | -msys[2]

それぞれで実行環境が変わる
-msysで基本的に良い

-defterm | -mintty | -conemu

開くターミナルの指定

  • -defterm
    • 標準ターミナルで開く
    • Windows TerminalやVSCodeで開く場合はこれを指定する
  • -mintty
    • Minttyが起動する
  • -conemu
    • Conemuが起動する

-here

現在の作業フォルダをカレントディレクトリとして開く

-where DIRECTORY

指定ディレクトリをカレントディレクトリとして開く

-[use-]full-path

Windowsのパスを継承する

-no-start

新窓で開かない
指定しない場合startコマンドでシェルが起動する

-shell SHELL

ログインシェルを指定する
例えば-shell zshならzshがログインシェルになる
未指定の場合bashがログインシェルになる
msys2_shell.cmdを書き換えて実現することもできるが、アップデートで書き換えた内容が消えることがあるのでオススメしない

-help | --help | -? | /?

ヘルプの表示

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でプロンプトに出したいコマンドを呼び出し、変数の値を書き換えてそれを表示するスタイルでやると上手くいきます

課題

  • プロンプトの速度が遅い
  • プロンプトする時に一瞬フォーカスが飛ぶ(別プロセルがコールされ一瞬窓ができている気がする
投稿日:
ソフトウェア::MSYS2ソフトウェア::zsh

MSYS2のzshで.zshを叩いたときに次のエラーが出るときの対策

./test.zsh: 2 行: read: -q: 無効なオプションです
read: 使用法: read [-ers] [-a array] [-d delim] [-i text] [-n nchars] [-N nchars] [-p prompt] [-t timeout] [-u fd] [name ...]

動かないシェルスクリプトのサンプル

  • 但しこれは動く
    • echo "yes or no (y/N): "; if read -q; then; echo hello; else echo abort; fi
echo 'yes or no (y/N): '
if read -q; then
  echo y
else
  echo n
fi

解決方法

  • 次のようにshebangを入れてやる
    • 多分shが呼ばれているのだと思う
#!/bin/zsh

echo 'yes or no (y/N): '
if read -q; then
  echo y
else
  echo n
fi

VSCodeのRemote - SSH拡張でSSH接続する時に毎回秘密鍵のパスフレーズを求められるのが面倒すぎるので、パスフレーズを記憶させて入力を省略させる方法を調べた

前提

  • Windows 10 or 11
  • Remote - SSH拡張を利用した公開鍵認証接続(パスフレーズあり)ができている
  • MSYS2を入れている

手順1

  1. PowerShellを管理者権限で起動させて次のコマンドを流す
    Set-Service ssh-agent -StartupType Automatic
    Start-Service ssh-agent
    Get-Service ssh-agent
    
  2. 秘密鍵をssh-agentに食べさせる
    ssh-add C:\Users\hoge\.ssh\id_rsa
    
  3. パスフレーズを求められるので入力
  4. 追加した秘密鍵が登録されていることを確認
     ssh-add -l
    
  5. VSCodeからRemote - SSHを使って接続する
  6. パスフレーズ無しで入れればOK、パスフレーズを求められたら以下の手順2へ

手順2

以下の警告が流れてうまく行かないケース、この場合はWindows付属のOpenSSHが腐っているので入れ替える

warning: agent returned different signature type ssh-rsa (expected rsa-sha2-512)
  1. PowerShellを管理者権限で起動させて次のコマンドを流して標準のOpenSSHをアンインストールする
    Get-Service -Name ssh-agent | Stop-Service
    sc.exe delete ssh-agent
    Remove-WindowsCapability -Online -Name "OpenSSH.Client~~~~0.0.1.0"
    Remove-WindowsCapability -Online -Name "OpenSSH.Server~~~~0.0.1.0"
    
  2. Chocolateyを入れる
    1. Set-ExecutionPolicy Bypass -Scope Process -Force; [System.Net.ServicePointManager]::SecurityProtocol = [System.Net.ServicePointManager]::SecurityProtocol -bor 3072; iex ((New-Object System.Net.WebClient).DownloadString('https://chocolatey.org/install.ps1'))
    2. chocoでインストール確認
  3. OpenSSHをインストールする
    choco install openssh --package-parameters="/SSHAgentFeature"
    
  4. サービスからssh-agentが実行中で自動起動するようになっていることを確認
  5. 秘密鍵をssh-agentに食べさせる
    ssh-add C:\Users\hoge\.ssh\id_rsa
    
  6. 追加した秘密鍵が登録されていることを確認
     ssh-add -l
    
  7. VSCodeからRemote - SSHを使って接続する
  8. パスフレーズ無しで入れればOK