如何让由 Tanuki 包装器运行的 Linux 程序“查看”.bash_profile 中的别名设置?

问题描述 投票:0回答:1

如何使用 Tanuki Wrapper (https://wrapper.tanukisoftware.com/)“查看”shell 别名来使 Java 程序在 Linux 上运行?

Java 应用程序由“Tanuki 包装器”脚本启动。该脚本依次由 nohup 启动,如下所示:

nohup ./start.sh &

假设我在

.bash_profile
中定义了一个这样的别名:

alias ls='ls -al'

当Java应用程序执行操作系统程序或命令(例如

ls
)时,我期望执行
ls -al
。然而,
ls
被执行——程序根本看不到别名。据我所知,Linux 中的别名通常在非交互式 shell 中不可用(例如由 nohup 运行的脚本或命令)。

因此我尝试进行修改以强制在 nohup 命令“内部”使用登录 shell。但没有任何作用!应用程序看不到别名:

nohup bash -l -c "./start.sh" &
nohup bash -l -c "source .bash_profile; ./start.sh" &

我怀疑问题出在 Tanuki Wrapper 上。据我了解,Tanuki Wrapper 在受控环境中运行程序,该环境通常不会继承 shell 的交互功能或自定义功能。

如何强制 Tanuki 包装器从交互式 shell 中获取设置?

linux bash tanuki
1个回答
0
投票

你不能。 Shell 别名不会以任何方式挂接到系统中的任何内容。它只是 shell 在解释输入之前对您的输入进行搜索和替换。 Java 程序不会这样做,因此不受别名的影响。

相反,您可以创建一个包装脚本并将其添加到您的路径中。这允许任何程序查找并调用脚本而不是支持命令:

$ cat bin/ls
#!/bin/bash
/bin/ls -la "$@"

$ chmod +x bin/ls
(no output)

$ cat Test.java
class Test {
        public static void main(String[] args) throws Exception {
          new ProcessBuilder("ls").redirectOutput(ProcessBuilder.Redirect.INHERIT).start();
        }
}

如果不更改 PATH,它将使用标准系统

ls
:

$ java Test.java
bin  Test.java

如果你确实更改了它,首先会找到脚本:

$ export PATH="$PWD/bin:$PATH"
$ java Test.java
total 16
drwxr-x---  3 user group 4096 Sep 19 18:26 .
drwxr-xr-x 45 user group 4096 Sep 19 18:26 ..
drwxr-x---  2 user group 4096 Sep 19 18:26 bin
-rw-r-----  1 user group  169 Sep 19 18:23 Test.java
© www.soinside.com 2019 - 2024. All rights reserved.