假设您有一个别名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 文件的目录时,都会获取该文件。
如果其他人可以在您的计算机上创建文件,请注意安全。
使用这个技巧,别名永远不会被删除,但您可以在函数中编写任意数量的代码。
翁迪尔使用这个技巧并有大量的附加功能。
答案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;"'