我的计算机上有一个旧版本的程序。该程序最近进行了版本升级。我以前运行旧程序的方式是键入“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'时,会执行新版本吗?
有没有办法实现这个目标?
谢谢
答案 0 :(得分:5)
如果程序本身从bin目录运行其他程序,那么当您运行版本1程序时,您希望确保版本1目录位于版本2目录之前的PATH上,反之亦然版本2程序。这是我一直处理的事情,我通过确保PATH设置得恰当来处理它。
在我的$ HOME / bin中,我会放置两个脚本:
export PATH=/path/to/my/old/programs/bin:$PATH
# Set other environment variables as needed
exec runProgram "$@"
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
)
现在这不会必然解决您的问题 - 可以在问题中使用更多信息,但它应该可以帮助您进一步了解您正在尝试做的事情。