リモートデスクトップ(RDP)経由で Linux 環境を操作していると、キーボードレイアウトの都合でパイプ (|; vertical bar) を入力したつもりが、破断線 (¦; broken bar) として入力されてしまう問題に遭遇した。
根本的には OS 側の設定やクライアントの設定によって解決すべき問題だが、今回は zsh のグローバルエイリアスを利用した.以下で紹介する:
zsh のグローバルエイリアスとは
zsh やその他シェルにおける通常のエイリアスがコマンド部分の置換しかできないのに対し、zsh のグローバルエイリアスはコマンドライン上の任意のトークンをエイリアスとして展開する。
つまり、パイプ記号のようなトークンであっても任意の文字列から展開できる。
方法
通常のエイリアスと同様に定義するが、 -g オプションを付与することでグローバルエイリアスとなる。
# 破断縦線 (¦) を通常のパイプ (|) で置換する alias -g ¦='|'
設定後は次のようになる:
# 入力(RDP 経由で ¦ が入力されてしまう) $ echo 'test' ¦ wc -c # 実際に展開・実行されるコマンド $ echo 'test' | wc -c
リスク
通常のエイリアス同様、この機能を利用したコマンドは環境依存のコマンドになる。
(当たり前だが)自分の環境以外では動作しないコマンドを仕込むリスクはあるので、シェルスクリプトを書く際や、実行したコマンドを外部にコピペして共有する可能性がある環境ではあまり多用すべきではないと言える。
あとがき(背景)
現在、Proxmox 上に構築した Ubuntu VM をコーディングエージェント用の作業環境として運用している。この環境への接続には SSH のほか、Windows App(旧リモートデスクトップ接続)を利用している。
リモートデスクトップ接続中にパイプ (|) を打つと、すべて破断線 (¦) として入力されてしまう問題に遭遇したのが問題の発端。
解決にあたっては、まず以下の方法を試行した:
- RDP クライアント側の設定変更:
Windows App の Keyboard Mode を
ScancodeからUnicodeに変更することでパイプ自体は入力可能になった。しかし、今度は IME の変換キー入力が正しく認識されなくなる別の問題が発生した。 - Ubuntu VM 上でのリマッピング: いくつかのキーボードリマッピングツールを試した。(keyd, input-remapper など)しかし、仮想化環境のハードウェア設定が噛み合っていないのか、入力イベントを正しく捕捉できず解決には至らなかった。
キーボード自体や仮想化の設定を突き詰めれば根本解決は可能だろうが、パイプ以外の入力では特に困っていない。深追いを避けるべく、今回は zsh の機能を利用して入力を吸収することにした。
本文での記載の通り環境依存のリスクはあるが、そもそもこの環境はコーディングエージェントがメインで動作する場所であり、自分自身の入力さえ通れば問題ない。このような経緯から今回の解決策に落ち着いた。