在ConEmu启动任务中使用WSL运行zsh别名

在ConEmu启动任务中使用WSL运行zsh别名,zsh,windows-subsystem-for-linux,wsl-2,conemu,Zsh,Windows Subsystem For Linux,Wsl 2,Conemu,我当前的WSL2+ConEmu+bash/zsh设置工作正常 我在我的.zshrc中设置了一些别名: //.zshrc alias mycommand1="[does some stuff]" alias mycommand2="[does other stuff]" if [ -f $HOME/.zshrc ]; then . $HOME/.zshrc fi if [ -v RUN_ALIAS ] && alias | grep

我当前的WSL2+ConEmu+bash/zsh设置工作正常

我在我的
.zshrc
中设置了一些别名:

//.zshrc
alias mycommand1="[does some stuff]"
alias mycommand2="[does other stuff]"
if [ -f $HOME/.zshrc ]; then
  . $HOME/.zshrc
fi

if [ -v RUN_ALIAS ] && alias | grep -q "^$RUN_ALIAS="; then
  eval "$RUN_ALIAS"
fi

unset RUN_ALIAS
unset ZDOTDIR
if [ -v RUN_ALIAS ] && alias | grep -q "^$RUN_ALIAS="; then
  eval "$RUN_ALIAS"
fi
我想要实现的是在两个单独的选项卡中运行
mycommand1
mycommand2
ConEmu启动任务,然后让这些选项卡保持打开状态

这需要ConEmu加载WSL+bash+zsh,然后运行命令

根据,我的默认任务当前运行本机wsl.exe:

// {Bash::bash} Task commands
%windir%\system32\wsl.exe -cur_console:pm:/mnt --distribution Ubuntu-20.04
而且,在仔细阅读了所有文档(,)并花了相当多的时间摆弄参数之后,我只能做出以下尝试:

%windir%\system32\wsl.exe --distribution Ubuntu-20.04 -new_console:pm:/mnt -- ls
// logs my Windows User directory and prompts "Press Enter or Esc to exit..."
我希望有一些建议:

  • 如何从wsl.exe传递一个命令,该命令将在Ubuntu上下文中运行,并配置所有bash/zsh
  • 我如何从ConEmu任务中做到这一点,确保在运行命令后,选项卡保持打开状态,并有常规的zsh shell提示
  • 还有什么我需要知道的来解决我的问题吗
简短回答:
  • 使用新的
    .zshrc
    创建一个新的启动目录,该目录(a)源于现有概要文件,并且(b)在启动shell之前基于环境变量集运行别名
  • 通过设置
    ZDOTDIR
    RUN\u ALIAS
    exec
    ing
    zsh-li
  • 通过
    wsl.exe
    命令运行这些命令
  • 设置ConEmu启动文件以运行适当的命令
步骤1:启动
zsh
,运行别名,并防止会话退出 假设:我假设你真的希望这些是别名。如果您想运行其他任意脚本/命令,您仍然可以这样做,但需要对指令稍作更改。我在下面总结了需要进行的更改

有几种方法可用于保持shell运行,但建议的方法要求您:

  • 创建嵌套的shell,这并不理想
  • 或者您现有的
    ~/.zshrc
    以“特殊情况”使用您的命令启动。这是一个巧妙的技巧,但我不喜欢在可以避免的情况下更改默认启动文件。也就是说,这要容易得多。如果你想走这条路,我会在这个答案的底部添加一些关于如何做的信息
但是
~/.zshrc
解决方案让我思考。如果您想在启动时运行任意命令,同时保持shell运行,答案是
.zshrc
。 您只需要为“特殊情况”使用不同的
.zshrc

bash
--rcfile
选项来选择要在启动时运行的文件,但是
zsh
等价物有点棘手,因为它涉及到设置
$ZDOTDIR
和更改
zsh
读取其启动(从)的位置

首先,让我们为“运行别名”配置创建一个配置目录:

当然,也可以在你想去的任何地方。然后,在该目录中创建以下内容:

>%windir%\system32\wsl.exe -cur_console:t:"MyCommand1" -cur_console:pm:/mnt ~ --distribution Ubuntu-20.04 --exec zsh -li -c "mycommand1; zsh -li"
>%windir%\system32\wsl.exe -cur_console:t:"MyCommand2" -cur_console:pm:/mnt ~ --distribution Ubuntu-20.04 --exec zsh -li -c "mycommand2; zsh -li"
~/.local/share/zsh/startup/run\u alias/.zshrc

//.zshrc
alias mycommand1="[does some stuff]"
alias mycommand2="[does other stuff]"
if [ -f $HOME/.zshrc ]; then
  . $HOME/.zshrc
fi

if [ -v RUN_ALIAS ] && alias | grep -q "^$RUN_ALIAS="; then
  eval "$RUN_ALIAS"
fi

unset RUN_ALIAS
unset ZDOTDIR
if [ -v RUN_ALIAS ] && alias | grep -q "^$RUN_ALIAS="; then
  eval "$RUN_ALIAS"
fi
~/.local/share/zsh/startup/run\u alias/.zprofile

if [ -f $HOME/.zprofile ]; then
  . $HOME/.zprofile
fi
当然,如果您总是知道您的
$HOME/.zsh
.zprofile
存在,那么条件是可选的。但最好是安全的

对MyCommand 2重复上述步骤

如果不明显,这将:

  • 调用现有的
    $HOME/.zshrc
    来定义别名(以及启动中的任何其他内容)
  • 检查以确保
    $RUN\u ALIAS
    的内容确实是一个别名(某些添加的安全性)
  • 调用
    RUN\u alias
    变量中定义的别名
  • 取消设置RUN_别名变量(清理)
  • 取消设置特殊的
    ZDOTDIR
    ,以便将来的子shell调用将使用
    $HOME
    中的文件
  • 将新的
    .zprofile
    源文件与原始文件一起提供
您现在可以通过调用子shell来测试这一点:

ZDOTDIR=~/.local/share/zsh/startup/run_alias RUN_ALIAS=mycommand1 zsh -li
当然,这会留下一个额外的子shell运行(
$SHLVL
为2)。因此,请改用
exec

ZDOTDIR=~/.local/share/zsh/startup/run_alias RUN_ALIAS=mycommand1 exec zsh -li
$SHLVL现在是1,您的命令/别名应该在当前(也是唯一)shell中执行,并且它仍在运行

为了让它在WSL中运行,我们确实需要启动一个“外壳”(由
exec
替换为使用适当的
zsh
)。对此,我倾向于使用
sh
,如下所示:

wsl ~ --distribution Ubuntu-20.04 --exec sh -c "ZDOTDIR=`$HOME/.local/share/zsh/startup/run_alias RUN_ALIAS=mycommand1 exec zsh -li" # PowerShell quoted
wsl ~ --distribution Ubuntu-20.04 --exec sh -c "ZDOTDIR=$HOME/.local/share/zsh/startup/run_alias RUN_ALIAS=mycommand1 exec zsh -li" # CMD (and ConEmu) quoted
旁注:我的
wsl的Windows终端配置文件实际上与此非常相似。我已经对它们进行了一些简化,但在启动shell(
fish
)和
tmux
之前,我仍然设置了一个环境变量(我希望选项卡的标题)

旁注2:我最初的回答使用了两个独立的
ZDOTDIR
,以及相应的目录。如果希望执行不同的命令(与别名相反),这仍然很有用。在这种情况下,创建其他目录,并通过更改
ZDOTDIR
指向它们。只需将您的命令放入相应目录中修改后的
.zshrc

在ConEmu启动时运行命令 简单的部分。创建一个
conemu\u start.txt
anywhere(和任意名称),真的:

在ComEmu中,将设置->启动->任务文件设置为此文件

应该这样做。启动ConEmu现在应该打开两个带有
zsh
的选项卡,每个别名/命令对应一个选项卡

备选方案:修改现有的
.zshrc
以基于环境变量运行别名 将以下内容添加到
~/.zshrc
的底部:

//.zshrc
alias mycommand1="[does some stuff]"
alias mycommand2="[does other stuff]"
if [ -f $HOME/.zshrc ]; then
  . $HOME/.zshrc
fi

if [ -v RUN_ALIAS ] && alias | grep -q "^$RUN_ALIAS="; then
  eval "$RUN_ALIAS"
fi

unset RUN_ALIAS
unset ZDOTDIR
if [ -v RUN_ALIAS ] && alias | grep -q "^$RUN_ALIAS="; then
  eval "$RUN_ALIAS"
fi
用以下方法进行测试:

RUN_ALIAS=mycommand1 exec zsh -li
然后将
conemu_start.txt
更改为:

>%windir%\system32\wsl.exe -cur_console:t:"MyCommand1" -cur_console:pm:/mnt ~ --distribution Ubuntu-20.04 --exec sh -c "RUN_ALIAS=mycommand1 exec zsh -li"
>%windir%\system32\wsl.exe -cur_console:t:"MyCommand2" -cur_console:pm:/mnt ~ --distribution Ubuntu-20.04 --exec sh -c "RUN_ALIAS=mycommand2 exec zsh -li"
简短答复:
  • 使用新的
    .zshrc
    创建一个新的启动目录,该目录(a)源于现有概要文件,并且(b)基于环境运行别名