「Windowsでのターミナル環境」の版間の差分
Notion-MW |
Notion-MW |
||
(同じ利用者による、間の14版が非表示) | |||
14行目: | 14行目: | ||
前項の目的を達するため、「自身に渡されたコマンドライン引数を(場合により多少の処理をした上で)ほぼそのまま使って他のコマンドを実行する」ようなプログラムを作成した。 | 前項の目的を達するため、「自身に渡されたコマンドライン引数を(場合により多少の処理をした上で)ほぼそのまま使って他のコマンドを実行する」ようなプログラムを作成した。 | ||
[https://github.com/ge9/win-console-delegator https://github.com/ge9/win-console-delegator] | [https://github.com/ge9/win-console-delegator <span>https://github.com/ge9/win-console-delegator</span>] | ||
このプログラムは、「自分自身のファイル名の最後の文字と最後から3番目の文字を<code>t</code>に変更したファイル(主にexe→txtを想定しているが、com→totなどでもよい)を読み込み、その内容と自分に与えられたコマンドライン引数をつなげた文字列をコマンドとして実行する」という挙動をする。すなわち、実行ファイルは(コンパイルし直さず)そのままコピーした上で、ペアとなる.txtファイルに適切な内容を書くことで、以下のようなプログラムが実現できる。 | このプログラムは、「自分自身のファイル名の最後の文字と最後から3番目の文字を<code>t</code>に変更したファイル(主にexe→txtを想定しているが、com→totなどでもよい)を読み込み、その内容と自分に与えられたコマンドライン引数をつなげた文字列をコマンドとして実行する」という挙動をする。すなわち、実行ファイルは(コンパイルし直さず)そのままコピーした上で、ペアとなる.txtファイルに適切な内容を書くことで、以下のようなプログラムが実現できる。 | ||
22行目: | 22行目: | ||
たとえばテキストファイルに以下のように書いておけば、mpvが起動される。<strong>末尾の半角スペースも入れること。</strong> | たとえばテキストファイルに以下のように書いておけば、mpvが起動される。<strong>末尾の半角スペースも入れること。</strong> | ||
< | <syntaxhighlight lang="vb.net">"C:\Users\username\Softwares\mpv\mpv.exe"</syntaxhighlight> | ||
Windows版のmpvは、設定ファイル(mpv.conf)やプラグインなどを自身が存在するディレクトリから読み込むが、それらの動作を維持したままで、.pathにはmpv.exeという呼び出し専用のファイルだけを配置することができる。 | Windows版のmpvは、設定ファイル(mpv.conf)やプラグインなどを自身が存在するディレクトリから読み込むが、それらの動作を維持したままで、.pathにはmpv.exeという呼び出し専用のファイルだけを配置することができる。 | ||
29行目: | 29行目: | ||
<code>myprogram somecommand arg1 arg2 ...</code>と呼び出されたときに、<code>C:\path\to\somecommand arg1 arg2 ...</code>をかわりに実行したい、ということがある。例えば複数の実行ファイルがまとまって提供されるような場合である。このときは以下のようなmycommand.txtをペアにすればよい。この場合はパスを直接引数につなげるため、<strong>末尾に半角スペースを入れてはいけない。</strong> | <code>myprogram somecommand arg1 arg2 ...</code>と呼び出されたときに、<code>C:\path\to\somecommand arg1 arg2 ...</code>をかわりに実行したい、ということがある。例えば複数の実行ファイルがまとまって提供されるような場合である。このときは以下のようなmycommand.txtをペアにすればよい。この場合はパスを直接引数につなげるため、<strong>末尾に半角スペースを入れてはいけない。</strong> | ||
< | <syntaxhighlight lang="python">C:\path\to\</syntaxhighlight> | ||
ところで、<code>C:\path\to\</code>の部分に空白文字が含まれている場合、このままではパスが正しく認識されない。通常はパス全体をダブルクォーテーションで囲うことでこれを回避するが、今回は与えられた引数のどこにダブルクォーテーションを挿入するかが自明ではない(<code>myprogram someprogram"</code>と入力させるという方法もあるが美しくない)ため、<strong>半角スペースを含まない別名</strong>(8.3形式)<strong>を使う</strong>のがよいだろう(短い名前については[[Windowsのパス長さ制限に関して|Windowsのパス長さ制限に関して]]も参照)。例えばProgram Filesなら普通は「PROGRA~1」になっているはずである。以下はGit Bashでのtxtファイルの例である。 | ところで、<code>C:\path\to\</code>の部分に空白文字が含まれている場合、このままではパスが正しく認識されない。通常はパス全体をダブルクォーテーションで囲うことでこれを回避するが、今回は与えられた引数のどこにダブルクォーテーションを挿入するかが自明ではない(<code>myprogram someprogram"</code>と入力させるという方法もあるが美しくない)ため、<strong>半角スペースを含まない別名</strong>(8.3形式)<strong>を使う</strong>のがよいだろう(短い名前については[[Windowsのパス長さ制限に関して|Windowsのパス長さ制限に関して]]も参照)。例えばProgram Filesなら普通は「PROGRA~1」になっているはずである。以下はGit Bashでのtxtファイルの例である。 | ||
< | <syntaxhighlight lang="vb.net">C:\PROGRA~1\Git\usr\bin\</syntaxhighlight> | ||
これにより、PATHを変更せずとも、例えば<code>gb grep</code>などとするだけでGit Bashの<code>grep</code>を呼び出すことができるようになる。gitやnpmやbusyboxやmagick(ImageMagick)のようにサブコマンドを指定して使うプログラムは多くあるが、これと同じような使用感になる。プレフィックスを設けることでそれぞれの名前の集合を別々に管理して衝突を防ぐ、という意味では、多くのプログラム言語で採用されている名前空間(namespace)に近い発想かもしれない。(コマンドにおけるこのような手法に特に名前は付いていないと思う。) | これにより、PATHを変更せずとも、例えば<code>gb grep</code>などとするだけでGit Bashの<code>grep</code>を呼び出すことができるようになる。gitやnpmやbusyboxやmagick(ImageMagick)のようにサブコマンドを指定して使うプログラムは多くあるが、これと同じような使用感になる。プレフィックスを設けることでそれぞれの名前の集合を別々に管理して衝突を防ぐ、という意味では、多くのプログラム言語で採用されている名前空間(namespace)に近い発想かもしれない。(コマンドにおけるこのような手法に特に名前は付いていないと思う。) | ||
39行目: | 39行目: | ||
上記と若干似ているが、PATHをはじめとした環境変数を変えることでプログラムがうまく実行されるようにしたい、という場合もある。この場合は、テキストファイルを以下のようにすればよい(Git Bashのフォルダをパスに追加し、<code>MYVAR</code>に<code>value1</code>をセットする例)。末尾の半角スペースはあってもなくてもいい。 | 上記と若干似ているが、PATHをはじめとした環境変数を変えることでプログラムがうまく実行されるようにしたい、という場合もある。この場合は、テキストファイルを以下のようにすればよい(Git Bashのフォルダをパスに追加し、<code>MYVAR</code>に<code>value1</code>をセットする例)。末尾の半角スペースはあってもなくてもいい。 | ||
< | <syntaxhighlight lang="bash">cmd /c path C:\Program Files\Git\usr\bin;%PATH% & set MYVAR=value1 &</syntaxhighlight> | ||
こちらは、先ほどと違って、内部でGit Bashのコマンドを使用する(Git Bashとは無関係な)プログラムを実行する際などに有用である。 | こちらは、先ほどと違って、内部でGit Bashのコマンドを使用する(Git Bashとは無関係な)プログラムを実行する際などに有用である。 | ||
また、これに類似のケースとして、環境変数の設定などを行うバッチファイルが既に用意されていてそれを使いたいという場合もある。例えば以下のようなテキストファイルを用いれば、実質的にVisual Studioの開発者コマンドプロンプト(Developer Command Prompt for VS 2022)の内部で与えられたコマンドを実行してくれるプログラムが作れる。 | また、これに類似のケースとして、環境変数の設定などを行うバッチファイルが既に用意されていてそれを使いたいという場合もある。例えば以下のようなテキストファイルを用いれば、実質的にVisual Studioの開発者コマンドプロンプト(Developer Command Prompt for VS 2022)の内部で与えられたコマンドを実行してくれるプログラムが作れる。 | ||
< | <syntaxhighlight lang="python">cmd /c C:\PROGRA~1\MIB055~1\2022\Community\Common7\Tools\VsDevCmd.bat &</syntaxhighlight> | ||
* ここでも短いパスを使用している。長いパスでも引用符で囲めばある程度うまく動作するが、<code>&</code>の後にくるコマンドに引用符が含まれている場合にうまくいかない。 | |||
Linuxでも、例えば特定のvenv仮想環境の中で与えられたコマンドを実行するシェルスクリプトを全く同じ発想で作ることができる。 | Linuxでも、例えば特定のvenv仮想環境の中で与えられたコマンドを実行するシェルスクリプトを全く同じ発想で作ることができる。 | ||
57行目: | 59行目: | ||
上記の例は、いずれもバッチファイルを使って似たようなことが実現できる。例えばGit Bashならそれぞれ | 上記の例は、いずれもバッチファイルを使って似たようなことが実現できる。例えばGit Bashならそれぞれ | ||
< | <syntaxhighlight lang="prolog">@C:\path\to\directory\%*</syntaxhighlight> | ||
や | や | ||
< | <syntaxhighlight lang="vb.net">@cmd /c "path C:\path\to\directory;%PATH% & %*"</syntaxhighlight> | ||
のようにする(<code>@</code>は、echo offを一時的に行うために必要である)。 | のようにする(<code>@</code>は、echo offを一時的に行うために必要である)。 | ||
しかし、cmd.exeには、バッチファイルの実行中にCtrl+Cを送信すると「バッチ ジョブを終了しますか (Y/N)? | しかし、cmd.exeには、バッチファイルの実行中にCtrl+Cを送信すると「バッチ ジョブを終了しますか (Y/N)?」というプロンプトを表示するという厄介な仕様がある。また、<code>%</code>で挟まれた環境変数(<code>%PATH%</code>など)が文字列として含まれていた場合に展開されてしまう。そのため、先ほどの自作プログラムを使用するほうがスマートである。 | ||
<span id="cygwin-msysmingw-git-bashの違い"></span> | <span id="cygwin-msysmingw-git-bashの違い"></span> | ||
92行目: | 94行目: | ||
<li><p>詳しくは、「msys2_shell.cmd」を読んでみると良さそうである。MSYSTEM環境変数というのが重要そう。</p></li></ul> | <li><p>詳しくは、「msys2_shell.cmd」を読んでみると良さそうである。MSYSTEM環境変数というのが重要そう。</p></li></ul> | ||
</li> | </li> | ||
<li>[https://m-hiyama.hatenablog.com/entry/20151013/1444704189 Mingw-w64/MSYS2 を入れなくても Git for Windows で間に合うみたい - 檜山正幸のキマイラ飼育記 (はてなBlog)] Git BashはMinGW/MSYSベースなので、そちらと同様に、MSYSTEM環境変数を<code>MINGW64</code>に設定すると/mingw64/ | <li>[https://m-hiyama.hatenablog.com/entry/20151013/1444704189 Mingw-w64/MSYS2 を入れなくても Git for Windows で間に合うみたい - 檜山正幸のキマイラ飼育記 (はてなBlog)] Git BashはMinGW/MSYSベースなので、そちらと同様に、MSYSTEM環境変数を<code>MINGW64</code>に設定すると/mingw64/binがパスに入る。ここにはgit.exeが入っているが、git.exe自体は実は/cmdに入っているので、そのことによる実効的な違いはあまりない。ということらしい。 | ||
<ul> | <ul> | ||
<li>ただgit以外にもxzコマンドとか/mingw64/binにしかないものもいくつかあるので、違いが全くないわけでもない。(なぜxzがこっちに入っているんだろう?)</li> | <li>ただgit以外にもxzコマンドとか/mingw64/binにしかないものもいくつかあるので、違いが全くないわけでもない。(なぜxzがこっちに入っているんだろう?)</li> | ||
105行目: | 107行目: | ||
Cygwinでは、実行は問題ないがwhich wtとすると見つからないと言われる(Git Bashでは大丈夫そう)(2023/08時点)。 | Cygwinでは、実行は問題ないがwhich wtとすると見つからないと言われる(Git Bashでは大丈夫そう)(2023/08時点)。 | ||
<span id="cygwinのforkに関するエラーを直す"></span> | |||
== Cygwinのforkに関するエラーを直す == | |||
setupを再実行してバイナリがアップデートされた後に、以下のようなエラーが頻発するようになることがある。毎回出るわけではなく、確率的に生じるので厄介である。 | |||
<syntaxhighlight lang="shell">child -1 – forked process 9272 died unexpectedly, retry 0, exit code 0xC0000142, errno 11</syntaxhighlight> | |||
<syntaxhighlight lang="shell">40 [main] bash 3348 fork: child -1 - forked process 4248 died unexpectedly, retry 0, exit code -1073741819, errno 11</syntaxhighlight> | |||
解決方法はいくつかある(単に再起動などで治る場合もある?)らしいが、自分の場合は以下のようにrebaseallというのをやることで治った。 | |||
[https://stackoverflow.com/questions/9300722/cygwin-error-bash-fork-retry-resource-temporarily-unavailable/14509551#14509551 Cygwin error: "-bash: fork: retry: Resource temporarily unavailable" - Stack Overflow](元記事は[https://cygwin.fandom.com/wiki/Rebaseall https://cygwin.fandom.com/wiki/Rebaseall]らしい) | |||
ここには<code>rebaseall -v</code>と書いてあるが、手元ではそのようなオプションがなさそうだったので単純にrebaseallとしたら、それでうまく行ったようである。 | |||
<ul> | |||
<li><p>まとめると、手順は以下。</p> | |||
<ul> | |||
<li>Cygwin関連のプロセスをすべて終了させる。</li> | |||
<li>/usr/binにある<strong>dash.exe</strong>を<strong>管理者権限で</strong>起動させる(おそらく軽量で依存関係が少ないから?)</li> | |||
<li><code>./rebaseall</code>を実行</li></ul> | |||
</li> | |||
<li><p>他には以下のようにWindowsのセキュリティ設定をいじる方法もあるようだが、ちょっと不安。</p> | |||
<p>[https://oni-gili.org/archives/290 https://oni-gili.org/archives/290]</p> | |||
<p>[https://umateku.com/archives/462 https://umateku.com/archives/462]</p></li></ul> | |||
<span id="cygwinでcmdにを出力させる"></span> | <span id="cygwinでcmdにを出力させる"></span> | ||
133行目: | 159行目: | ||
<div style='text-align: center;'>Windows Terminalの見た目</div> | <div style='text-align: center;'>Windows Terminalの見た目</div> | ||
しかし、あまり知られていないようだが、このconhost.exeには「<strong>文字を選択した状態(ウインドウタイトルに「選択」と出る)だと一切の出力がブロックされる</strong>」という仕様があるようである(文字選択を容易にするため?参考: [https://github.com/microsoft/terminal/issues/34 https://github.com/microsoft/terminal/issues/34])。例えば<code>ping -t localhost</code>を実行して文字を選択してみるといいだろう。方向キーや文字を入力するなどして選択状態を解除すると出力は再開する。 | しかし、あまり知られていないようだが、このconhost.exeには「<strong>文字を選択した状態(ウインドウタイトルに「選択」と出る)だと一切の出力がブロックされる</strong>」という仕様があるようである(文字選択を容易にするため?参考: [https://github.com/microsoft/terminal/issues/34 <span>https://github.com/microsoft/terminal/issues/34</span>])。例えば<code>ping -t localhost</code>を実行して文字を選択してみるといいだろう。方向キーや文字を入力するなどして選択状態を解除すると出力は再開する。 | ||
この仕様により、[https://stackoverflow.com/questions/8140804/how-can-i-stop-my-server-from-freezing-when-powershell-is-in-select-mode ruby on rails - how can I stop my server from freezing when powershell is in 'select' mode? - Stack Overflow] などにあるように、サーバーアプリケーションの実行が出力の際に意図せずブロックされるといった問題が起こる(筆者は[[error_private_page|error_private_page]]のサーバーを使っている際にこの問題に気付いた)。また、詳しい条件はわからないが、筆者の経験では、<strong>単にそのコンソールウインドウを長時間使わず放置するだけでも同じ現象が発生する</strong>ことがあり、文字選択をしないように気を付けるだけでは不十分なようである。 | この仕様により、[https://stackoverflow.com/questions/8140804/how-can-i-stop-my-server-from-freezing-when-powershell-is-in-select-mode ruby on rails - how can I stop my server from freezing when powershell is in 'select' mode? - Stack Overflow] などにあるように、サーバーアプリケーションの実行が出力の際に意図せずブロックされるといった問題が起こる(筆者は[[error_private_page|error_private_page]]のサーバーを使っている際にこの問題に気付いた)。また、詳しい条件はわからないが、筆者の経験では、<strong>単にそのコンソールウインドウを長時間使わず放置するだけでも同じ現象が発生する</strong>ことがあり、文字選択をしないように気を付けるだけでは不十分なようである。 | ||
147行目: | 173行目: | ||
[https://chiyosuke.blogspot.com/2018/05/blog-post_7.html ちよぶろ。: コマンドプロンプトの色を変える。] | [https://chiyosuke.blogspot.com/2018/05/blog-post_7.html ちよぶろ。: コマンドプロンプトの色を変える。] | ||
例えば黄色(<code>33</code>)+太字(<code>01</code>)+末尾空白(<code>$S</code>)なら | |||
<syntaxhighlight lang="shell">$E[33;01m$P$E[0m$G$S</syntaxhighlight> | |||
ただしVista以降~Windows 10の途中(1607より前?)ではcmd+conhostという組み合わせ(といっても多分cmdを使うとしたら事実上conhostが必要となる)だとエスケープ文字がそのまま表示されてしまい色がつかない。これは[https://github.com/adoxa/ansicon ansicon]で解決できる。 | ただしVista以降~Windows 10の途中(1607より前?)ではcmd+conhostという組み合わせ(といっても多分cmdを使うとしたら事実上conhostが必要となる)だとエスケープ文字がそのまま表示されてしまい色がつかない。これは[https://github.com/adoxa/ansicon ansicon]で解決できる。 | ||
156行目: | 185行目: | ||
プロファイルを自分で追加できるなどの仕様は、Windowsにしてはなかなか偉い感じがする。 | プロファイルを自分で追加できるなどの仕様は、Windowsにしてはなかなか偉い感じがする。 | ||
フォントは、GUIからではなく設定ファイルを変更する必要はあるが、変えられる。デフォルトのCascadia | フォントは、GUIからではなく設定ファイルを変更する必要はあるが、変えられる。デフォルトのCascadia Codeより<strong>Consolas</strong>のほうが英数字が日本語のちょうど半分のサイズになるので読みやすい。 | ||
< | <syntaxhighlight style="margin-bottom:0.2em;" lang="vb.net">"defaults": { | ||
"font":{ "face": "Consolas", | |||
"size": 12 | |||
} | } | ||
},</ | },</syntaxhighlight> | ||
<div style='text-align: center;'>設定例</div> | <div style='text-align: center;'>設定例</div> | ||
CSSのように複数のフォントを指定することはまだできないようである。[https://github.com/microsoft/terminal/issues/2664 https://github.com/microsoft/terminal/issues/2664] まあこれはしょうがないだろう。 | CSSのように複数のフォントを指定することはまだできないようである。[https://github.com/microsoft/terminal/issues/2664 <span>https://github.com/microsoft/terminal/issues/2664</span>] まあこれはしょうがないだろう。 | ||
==== 太字 ==== | |||
[https://github.com/microsoft/terminal/issues/109 <span>https://github.com/microsoft/terminal/issues/109</span>]の通り、反映されない不具合があった。そこに書いてある通り、Windows Terminalの設定画面から開ける(下部にボタンあり)JSONファイルの”profiles”にある<code>"defaults": {}</code>またはその下の”list”の各プロファイルの中身に<code>"intenseTextStyle": "bold"</code>と書くことで治った。 | |||
<syntaxhighlight lang="javascript">{ | |||
....//省略 | |||
"profiles": | |||
{ | |||
"defaults": { | |||
"intenseTextStyle": "bold" //ここ | |||
}, | |||
"list": | |||
[ | |||
.... | |||
{ | |||
"commandline": "%SystemRoot%\\System32\\cmd.exe", | |||
"font": | |||
{ | |||
"face": "Consolas" | |||
}, | |||
"guid": "{00000000-4444-3333-2222-111111111111}", | |||
"hidden": false, | |||
"name": "name", | |||
"intenseTextStyle": "bold" //またはここ | |||
}, | |||
.... | |||
] | |||
}, | |||
}</syntaxhighlight> | |||
== コマンドライン引数をめぐる仕様 == | == コマンドライン引数をめぐる仕様 == | ||
{{UnderConstruction|Windowsでのターミナル環境}} | {{UnderConstruction|Windowsでのターミナル環境}} | ||
[[Category:IT]][[Category:Windows]]{{#seo:|title={{FULLPAGENAME}} - Turgenev's Wiki}} | [[Category:IT]][[Category:Windows]]{{#seo:|title={{FULLPAGENAME}} - Turgenev's Wiki}} |