私はWSL1でUbuntuを実行しており、Windowsで異なるショートカットを作成して、WSLの起動時に異なるコマンドを実行したいと考えています。たとえば、SSHセッションを自動的に開始するコマンドや、特定のディレクトリに変更するコマンドなどです。起動コマンドが実行されると、通常どおり実行し続ける必要がありますが、試したすべての操作でターミナルが閉じられます。次のようなことを試しました。
c:\windows\system32\bash.exe -c -i -s ssh ip
しかし、何もしていないように見えます。あるいは、何かが起こっているとしても、すぐに閉じてしまうので、私にはわかりません。
答え1
wsl.exe
まず、ではなく、新しい (Microsoft 推奨) コマンドを使用することをお勧めしますbash.exe
。 bash.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 には同様のスイッチはありません。