在 ZSH 上创建别名但需要输入两次

在 ZSH 上创建别名但需要输入两次

我正在尝试在 ZSH 上创建别名。

别名的目的是激活 python virtualenv。

我已经在我的.zshrc

alias SOU="source /home/andykw/.zshrc && source $(setopt extendedglob &&  ls -d .^git/)/bin/activate"

我经常需要通过激活其中一个文件夹中的虚拟环境来更改虚拟环境,然后切换到另一个文件夹并激活另一个虚拟环境。

示例:假设我正在使用该文件夹flask_rest,并且必须处理另一个项目,django_rest我需要停用环境flask_rest并激活django_rest环境。

我只需要键入,而不是使用命令行多次执行此操作,source <folder_name>/bin/activate然后再使用另一个文件夹。source <another_folder_name>/bin/activateSOU

希望它能让上下文更清楚。

PS:我使用 Ubuntu 和 Windows 子系统 Linux。

答案1

听起来你想要类似的东西:

SOU() {
  set -o localoptions -o extendedglob
  local f
  for f (~/.zshrc ~/.(^git)/bin/activate(N.)) source $f || return
}

用于SOU获取您的文件以及在主目录之外的隐藏目录中~/.zshrc调用的任何文件(忽略它对我来说似乎没有多大意义的事实)。bin/activate.git

您可能还需要添加Ur限定符以限制您拥有且所有者可读的文件。

这定义了一个功能而不是一个别名。别名更适合 csh 用户。类似 Bourne 的 shell 具有适当的编程结构,例如函数,尽管在某些极端情况下,当您使用别名时,别名仍然有用。希望将其作为文本替换处理,或者别名需要在调用者的范围内进行更改,但这里似乎都不是这种情况。

您可以将该函数定义放入您的目录中~/.zshrc,也可以将其作为可自动加载函数添加到您的目录之一中$fpathinfo zsh autoloading详情请参阅。

无论如何,采购~/.zshrc并不撤消thosedirs/bin/activate文件的作用是什么。它只是重做无论再次发生什么~/.zshrc(这可能最终会撤销所带来的一些变化bin/activate,但这将是偶然的),如果其中一些变化是添加的,它们最终会在其他问题

答案2

如果您想要的只是一个可以找到的别名单身的 ./.*/bin/activate当前目录树中的文件并获取它,那么您需要的是:

alias SOU='source. */bin/activate'

如果 glob.*/bin/activate匹配多个文件,则仅获取第一个文件。每次打开新的非登录交互式 shell 会话时都应该获取您的~/.zshrc文件,并且您可能不希望多次获取它。我建议您提出一个新问题来尝试理解为什么您似乎需要明确地获取它。

相关内容