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


18

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

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

顺便说一句,我已经有一个别名可以切换到上述目录,所以可以将go别名分配附加到foo别名上吗?

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

在OSX上使用bash(?)。


1
这就是makefile的用途。
itsbruce 2012年

Answers:


16

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

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;
}

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


4

我感觉到您非常“面向目录”,在这种情况下,这可能会更好地适应您的想法。

(但是,老实说,我认为这完全不是一个好主意,您希望命令具有全局性。)

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

然后,在每个这样的目录中,放入一个名为的脚本.cmd,然后是chmod +x .cmd,然后go执行您的操作。


2
大量的工作...这是用例:在运行测试时,我想给rspec-all别名以运行某些测试。但是哪些测试取决于项目。这由目录确定。
B

2
我看到的是,您有两个选择,或者使用一个函数(例如上述@Bernhard),然后根据目录进行分支(就像他说的那样),或者可以将参数放入目录中。想一想,它不一定是脚本,您只需touch .TESTNO; echo 2 > .TESTNO在每个目录中放置一个文件(),然后在您的函数中查找该文件,并根据.TESTNO文件的测试编号进行分支包含。尽管一点都不困难,但您可能无法为此使用别名。您必须使用一个函数。
伊曼纽尔·伯格

2

我正在完成一个项目。出:localalias

这是一个演示:

在此处输入图片说明

有趣的是,我实际上go在演示中用作示例。我没有显示切换目录(关于演示,我应该进行一些更改),但是带有la命令的功能确实在定义它们的目录中是本地的。


1
function go() {
  if [ ! -e "./.cmd1" ]
    then command go -a $1
    else command go -b $1
  fi
}

类似的事情,但是假设“ go”是一个命令,则您需要与特定目录中不同的功能。


1

如果将以下函数添加到.bashrc中

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

每次cd到带有.aliases文件的目录时,它都会被获取。

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

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

ondir使用此技巧,并有大量的铃声和口哨声。

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


尽管我认为这很聪明,但由于依赖于它,看来十分危险.bashrc。(例如,这不适cron用于)。
ctbrown

我不确定bashrc是否有任何危险。我相信这是别名的标准/正确位置。它们在环境的本质上是不同的。提出问题,那就是需要一个不同的环境。如果您希望cron具有类似的环境,那么您可以阻止您在cron中采购用户.bashrc 。由于使用了isatty和chumm,应始终注意NB cron的行为与交互式shell不同。
teknopaul

的确,bashrc本身没有任何危险。问题是您无法确保更改为目录的进程将源bashrc。如果这是您的交互式会话,那是一回事。如果在不使用bash shell的用户和进程之间共享该目录,则是另一回事。在某些系统上,.bash_aliases是bash别名的首选位置。
ctbrown
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.