在ConEmu启动任务中使用WSL运行zsh别名
我当前的WSL2+ConEmu+bash/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
.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提示
- 还有什么我需要知道的来解决我的问题吗
- 使用新的
创建一个新的启动目录,该目录(a)源于现有概要文件,并且(b)在启动shell之前基于环境变量集运行别名.zshrc
- 通过设置
、ZDOTDIR
和RUN\u ALIAS
ingexec
zsh-li
- 通过
命令运行这些命令wsl.exe
- 设置ConEmu启动文件以运行适当的命令
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_别名变量(清理)
- 取消设置特殊的
,以便将来的子shell调用将使用ZDOTDIR
中的文件$HOME
- 将新的
源文件与原始文件一起提供.zprofile
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)基于环境运行别名