是否可以在 zsh(或任何其他 shell)中定义目录敏感的别名?

是否可以在 zsh(或任何其他 shell)中定义目录敏感的别名?

我想根据当前工作目录使用不同的别名(或者可能:相同的别名不同)。例如,我可能想使用一些额外选项l的简写。ls我想使用两种变体:

alias l="ls --sort=extension" # variant A
alias l="ls --quoting-style=literal" # variant B

通常,我想使用变体 A。但是,在列出图片时我想使用变体 B – 也就是说,当我的工作目录是~/pictures. (这只是一个最小的例子。我的实际用例更复杂。)

我知道我可以简单地编写一个l()在 的输出上区分大小写的函数$(pwd)。但是,我想要一个更强大的解决方案,它允许我重命名特定目录而不更改任何别名(并且这不会扰乱我的.zshrc)。

但有可能吗覆盖或者添加别名,例如通过在相关目录中设置本地.zshrc(就像 vim 和 local 一样.vimrc)?

此外,它(也)可能在 bash 或任何其他 shell 中吗?

答案1

如果您正在使用哦我的zsh,只需激活dotenv插入

plugins+=(dotenv)
ZSH_DOTENV_FILE=.any-name-you-like-for-the-per-directory-alias-file

还考虑迪伦夫,它允许您导出每个目录中的环境变量.envrc当您离开时取消它们(这是dotenv不可能的)。 direnv 与所有流行的 shell 兼容。然而,它并没有现在让您定义别名或函数。

你仍然可以组合伊尔卡丘的方法使用 direnv,通过创建一个函数(而不是别名)来根据一个(或多个)环境变量决定要执行的操作,而环境变量又由 direnv 设置。

这两种方法都通过让您手动将点文件的来源目录列入白名单来处理安全问题。

答案2

您可以创建一个函数或脚本来检查当前目录中的某些文件并据此更改行为:

l() {
    if [ -f ./.ls-literal-quote ] ; then
         ls --quoting-style=literal "$@"
    else
         ls --sort=extension "$@"
    fi
}

类似的东西将允许您将配置保留在目录本身中,而不是某个集中位置(如果您想要的话)。

现在,这需要在涉及的目录中散布额外的文件,但是您可以通过使用来解决这个问题扩展属性(如果您的系统支持)。

答案3

我正在开发一个项目来实现这一目标。一探究竟:本地别名

它允许您创建和使用定义它们的目录本地的伪别名和函数。也许最好的部分是它无需执行任何危险的“源”命令即可完成此操作。这些解决方案更简单、更快捷,但存在很大的安全问题。

这是一个演示:

在此输入图像描述

答案4

当然;只需将别名扩展为一些为您执行测试的 shell 代码:

alias l="[[ $PWD =~ /pictures$ ]] && ls --quoting-style=literal || ls --sort=extension"

相关内容