在linux中混淆同一程序的两个不同版本?

时间:2012-03-20 22:02:10

标签: linux shell path environment-variables alias

我的计算机上有一个旧版本的程序。该程序最近进行了版本升级。我以前运行旧程序的方式是键入“runProgram”。我的程序的脚本路径在我的PATH变量中指定为

PATH = ....:/path/to/my/old/programs/bin

我想在我的旧程序旁边运行同一个程序的新版本,我想这样做的方法是修改我的PATH变量,如下所示:

PATH = ....:/path/to/my/old/programs/bin:/path/to/my/new/programs/bin

我想要实现的是为这两个路径设置别名的方法,这样当我输入'runVersion1'时,会执行以前的版本,当我输入'runVersion2'时,会执行新版本吗?

有没有办法实现这个目标?

谢谢

3 个答案:

答案 0 :(得分:5)

如果程序本身从bin目录运行其他程序,那么当您运行版本1程序时,您希望确保版本1目录位于版本2目录之前的PATH上,反之亦然版本2程序。这是我一直处理的事情,我通过确保PATH设置得恰当来处理它。

在我的$ HOME / bin中,我会放置两个脚本:

RunVersion1

 export PATH=/path/to/my/old/programs/bin:$PATH
 # Set other environment variables as needed
 exec runProgram "$@"

RunVersion2

 export PATH=/path/to/my/new/programs/bin:$PATH
 # Set other environment variables as needed
 exec runProgram "$@"

这种在其他程序之前将shell脚本放在我的PATH上的技术允许我选择我运行的程序。

半通用版

通常,我将使用单个程序来设置环境,然后将其链接到我想要处理的各种程序名称。然后它会查看$0并运行:

 export PATH=/path/to/my/new/programs/bin:$PATH
 # Set other environment variables as needed
 exec $(basename $0 2) "$@"

如果此脚本链接到RunProgram2,则basename命令会从RunProgram2的末尾删除2,然后从最近的目录执行RunProgram。 / p>

我也使用这种通用技术在一台机器上访问32位和64位版本的软件。我处理的程序往往比$ PATH的设置更复杂,所以脚本更大。

$ HOME / bin中的脚本与别名之类的主要优点之一是,使用哪个shell并不重要;它的工作方式相同。另外,我没有太多的地方可以找到定义别名的位置(因为它没有定义)。

答案 1 :(得分:2)

我会在你的〜/ .bashrc中放两个别名定义(取决于你使用的shell)。

alias runVersion1='/path/to/my/old/programs/bin/program'
alias runVersion2='/path/to/my/new/programs/bin/program'

编辑该文件后,您需要重新登录或执行

. ~/.bashrc

答案 2 :(得分:1)

您使用$PATH建议的方式无法满足您的需求。可能的一种方式:

鉴于通常/usr/local/bin位于$PATH,并且这是“本地二进制文件”的标准位置,您可以执行以下操作:

sudo ln -s /path/to/my/old/programs/bin/myprogram /usr/local/bin/runVersion1
sudo ln -s /path/to/my/new/programs/bin/myprogram /usr/local/bin/runVersion2

或者,如果您不希望它是系统范围的(即只为您的用户),您可以:

ln -s /path/to/my/old/programs/bin/myprogram $HOME/bin/runVersion1
ln -s /path/to/my/new/programs/bin/myprogram $HOME/bin/runVersion2

(假设$HOME/bin中有$PATH

现在这不会必然解决您的问题 - 可以在问题中使用更多信息,但它应该可以帮助您进一步了解您正在尝试做的事情。