如何为每个目录设置别名?

如何为每个目录设置别名?

假设您有一个别名go,但希望它在不同的目录中执行不同的操作?

在一个目录中它应该运行cmd1,但在另一个目录中它应该运行cmd2

顺便说一句,我已经有一个用于切换到上述目录的别名,那么是否可以将go别名分配附加到foo别名上?

alias "foo=cd /path/to/foo"

在 OSX 上使用 bash(?) 工作。

答案1

不完全确定您在问什么,但别名只是扩展到别名中的内容。如果您有两个别名,则可以附加不同的命令,甚至是别名。

alias "foo=cd /path/to/foo; go"
alias "foo2=cd /path/to/foo2; go"

在任何其他情况下,您可以在您的.bashrc

function go ()
{
    if [ "$PWD" == "/path/to/foo" ]; then
       cmd1
    elif [ "$PWD" == "/path/to/go" ]; then
       cmd2
    fi;
}

如果你有更多的选择,你最好使用案例结构。

答案2

如果您将以下功能添加到您的.bashrc

function cd () { 
  builtin cd "$@" && [[ -f .aliases ]] && . .aliases
  return 0
}

每次您 cd 到包含 .aliases 文件的目录时,都会获取该文件。

如果其他人可以在您的计算机上创建文件,请注意安全。

使用这个技巧,别名永远不会被删除,但您可以在函数中编写任意数量的代码。

翁迪尔使用这个技巧并有大量的附加功能。

http://swapoff.org/ondir.html#download

答案3

我感觉你非常“面向目录”,在这种情况下,这可能更适合你的心态。

(但说实话,我认为这完全是一个坏主意,您希望命令是全局的。)

.bashrc,放入alias go="./.cmd"(然后source ~/.bashrc)。

然后,在每个这样的目录中,放置一个名为 的脚本.cmd,然后chmod +x .cmd,然后go做你的事情。

答案4

我花了很长一段时间寻找一种方法来做到这一点,今天我想出了一个解决方案,它是其他一些答案的综合,但有一种秘密成分可以增加酱汁;direnv

.aliases正如 @teknopaul 所提议的那样,每次都读取它的问题是,您积累了定义,但它们永远不会卸载。direnv通过加载解决了这个问题和卸货每个目录的环境变量。不过,这只是处理环境变量,但我们可以将它与函数一起使用!

这是我的别名npm(当然,不是别名,而是函数):

function npm(){ if [[ -z "$NPMBIN" ]]; then $(which npm) $@; else $NPMBIN $@; fi; }

alias您还可以通过在子 shell 中执行逻辑来将上面的内容重写为 true ,但是您需要注意转义引号!

alias npm='bash -c "if [[ -z \"$NPMBIN\" ]]; then $(which npm) $@; else \"$NPMBIN\" $@; fi;"'

相关内容