自動的に閉じずにコマンドで WSL ターミナルを開くにはどうすればよいですか?

自動的に閉じずにコマンドで WSL ターミナルを開くにはどうすればよいですか?

私はWSL1でUbuntuを実行しており、Windowsで異なるショートカットを作成して、WSLの起動時に異なるコマンドを実行したいと考えています。たとえば、SSHセッションを自動的に開始するコマンドや、特定のディレクトリに変更するコマンドなどです。起動コマンドが実行されると、通常どおり実行し続ける必要がありますが、試したすべての操作でターミナルが閉じられます。次のようなことを試しました。

c:\windows\system32\bash.exe -c -i -s ssh ip

しかし、何もしていないように見えます。あるいは、何かが起こっているとしても、すぐに閉じてしまうので、私にはわかりません。

答え1

wsl.exeまず、ではなく、新しい (Microsoft 推奨) コマンドを使用することをお勧めしますbash.exebash.exeはまだ利用可能ですが、Microsoft はこれを「 に置き換えられた」 "歴史的なコマンド" と呼んでいますwsl.exe。 このwslコマンドには、古い よりもはるかに多くのオプションも用意されていますbash.exe

最初の問題は、コマンド ラインに構文/引用符のエラーがあることです。そのため、Windows ターミナル タブは読み取る前に閉じてしまいます。出力を確認するには、まず PowerShell または CMD プロファイル/タブからこれを実行するのが最適です。

PS> bash.exe -c -i -s ssh ip
usage: ssh [-46AaCfGgKkMNnqsTtVvXxYy] [-B bind_interface]
           [-b bind_address] [-c cipher_spec] [-D [bind_address:]port]
           [-E log_file] [-e escape_char] [-F configfile] [-I pkcs11]
           [-i identity_file] [-J [user@]host[:port]] [-L address]
           [-l login_name] [-m mac_spec] [-O ctl_cmd] [-o option] [-p port]
           [-Q query_option] [-R address] [-S ctl_path] [-W host:port]
           [-w local_tun[:remote_tun]] destination [command]
PS> bash.exe -c "ssh ip"
user@ip's password:
PS> wsl ssh ip
user@ip's password:
PS> wsl -e bash -c ssh ip
<displays usage information as above>
PS> wsl -e bash -c "ssh ip"
user@ip's password:

ご覧のとおり、コマンド文字列を に渡す場合はbash -c、引用符で囲む必要があります。そうしないと、bash は なしsshでを認識することになりますip

wsl一方、コマンドは、する引用符なしで直接呼び出すことができます。基本的には、コマンドラインの残り (すべての引数/フラグが処理された後) を引数に引用符を付けてデフォルトのシェルに渡すのに十分なほどスマートです-c。この例は、上記の で確認できますwsl ssh ip

次に、コマンドを実行した後、タブ/シェルを開いたままにする方法を知りたいと思います。これにはいくつかの方法がありますが、最も簡単な方法は次のとおりです。

  • シェルを起動する
  • 最初のコマンドを実行する
  • exec継続して稼働する交換用シェル

ご経験のとおり、最初の 2 つを実行するだけで、コマンドの終了時にシェルが閉じられます。

次のようになります:

wsl -e bash -c "ls; exec bash"

答え2

C:\Windows\System32\cmd.exe /k wsl /path/to/script.sh

/k スイッチは cmd を終了させないので、出力を読み取ることができます。wsl には同様のスイッチはありません。

関連情報