在Linux shell脚本中,让系统优先使用别名而不是二进制

z9ju0rcb  于 2023-05-06  发布在  Linux
关注(0)|答案(1)|浏览(208)

我目前正在为我的大学做一个Java项目。该项目需要在我的大学提供的运行CentOS Linux的特定服务器上运行。它还需要由我的教授提供的shell脚本运行,我不允许修改。shell脚本的格式如下:scenario.sh

node 0 100 2 "this is a message from 0" 30 1 &
node 1 100 2 "this is a message from 1" 30 2 &
node 2 100 2 1 &

shell脚本只是运行我的程序的3个副本及其所需的命令行参数。因此,“node”需要是可执行文件的名称/别名,以便shell脚本可以执行它。由于我的程序是用java编写的,而java需要“java”命令来运行程序,所以我设置了alias node='java node'。为了清楚起见,我在终端中按顺序放置的命令是:

> javac Node.java
> alias node='java Node'
> sh scenario.sh

我开发并成功地在另一台指定用于开发的服务器上运行了该程序。但是,当我尝试在测试服务器上运行该程序时,它失败了。我发现问题是测试服务器安装了Node.js,它是用命令“node”运行的。因此,当我运行shell脚本时,它试图运行Node.js而不是我的Java程序。由于它是大学拥有的服务器,我无法卸载Node.js,也没有sudo/root访问权限。有没有什么命令可以让系统优先运行别名而不是Node.js?如果没有,还有其他方法可以解决这个问题吗?
我试着在终端中运行shell脚本中的每个命令,并且工作正常。我假设这意味着终端在命令二进制文件之前优先考虑别名,而shell脚本不这样做。无论如何,这都不是一个可接受的解决方案,因为项目要求从shell脚本运行程序。我也浏览过stack overflow和其他网站寻找解决方案,但似乎都涉及使用sudo。我在测试服务器上没有sudo权限。

e5njpo68

e5njpo681#

一个可能的解决方案是修改shell脚本,显式地使用Java可执行文件的完整路径,而不是依赖于“node”别名。您可以通过在测试服务器上运行命令“which java”来找到Java可执行文件的完整路径。然后,将shell脚本中的“node”替换为完整路径。
例如,如果“which java”的输出是“/usr/bin/java”,则可以如下修改shell脚本:

/usr/bin/java Node 0 100 2 "this is a message from 0" 30 1 &
/usr/bin/java Node 1 100 2 "this is a message from 1" 30 2 &
/usr/bin/java Node 2 100 2 1 &

这应该确保使用Java可执行文件而不是Node.js。
如果不能修改shell脚本,您可以尝试将Java可执行文件从“node”重命名为其他名称,例如“my_node”,并更新shell脚本以使用新名称。这应该可以防止与Node.js的任何冲突。
或者,您可以尝试在shell脚本中设置PATH环境变量,以便在包含Node.js可执行文件的目录之前包含包含Java可执行文件的目录。举个例子

export PATH=/path/to/java/bin:$PATH
java Node 0 100 2 "this is a message from 0" 30 1 &
java Node 1 100 2 "this is a message from 1" 30 2 &
java Node 2 100 2 1 &

这应确保首先找到并使用Java可执行文件。

相关问题