【问题标题】:Linux terminal: How to pass an argument to another argumentLinux终端:如何将一个参数传递给另一个参数
【发布时间】:2011-10-20 14:16:45
【问题描述】:

我有一个在特殊环境中运行其他程序的系统程序: cset shield -e PROGRAM。现在要运行一个 java 程序,我输入了cset shield -e java PROGRAM,但这不起作用。原来我必须指定java的完整路径。但是,PATH 已设置,因此 java PROGRAM 可以单独使用。有没有更简单的方法来做到这一点?

另外,我的另一个java程序需要外部库并且可以自己运行。但是使用cset shield,我得到了NoClassDefFoundError,这意味着它找不到库。添加类路径参数 (-cp CLASSPATH) 会导致错误消息 "p" contains invalid characters: p


在尝试了各种建议及其排列之后,我想到了一种行之有效的方法:cset shield --exec -- $(which java) -cp ./:<LIB_PATH>/DA_LIB.jar PROGRAM。但有了这个我得到UnsatisfiedLinkError: Library not found: DA_LIB

【问题讨论】:

  • “cset”程序运行其他程序的环境有什么特别之处?似乎它所做的任何更改都不利于 Java 的运行。它可能会清除 CLASSPATH 并可能损坏 PATH 甚至可能损坏 LD_LIBRARY_PATH。因此,您需要研究“cset”(手册页或源代码或两者兼而有之)以了解它的作用以及导致您焦虑的原因。
  • @Jonathan 该手册说:“请注意,如果您执行的命令带有选项,则使用传统的“--”标记将 cset 的选项与命令的选项分开。例如:# cset shield --exec — ls -l此命令将在防护罩内执行“ls -l”。”但是,虽然这允许我运行像 ls 这样的常规程序,但运行 java 会给我带来 No such file or directory 错误。
  • @wmjdgla:正如@Jonathan Leffler 所指出的,cset shield 似乎改变了你的环境,特别是PATHCLASSPATH,但也可能是你的当前目录。如果是这种情况,则将相对目录放在类路径中没有多大意义。例如,您在那里有./,这可能没有多大用处(因为当前目录将被更改)。我不知道 <LIB_PATH> 在你的情况下是什么,只要确保所有路径都是绝对的。

标签: java linux terminal command-line-arguments


【解决方案1】:

你可以尝试which来定位java:

cset shield -e $(which java) PROGRAM

这将在特殊环境下运行java,而不是在子shell中。 (which 显然会在子 shell 中运行)。

要修复CLASSPATH 问题:我无法在此处进行测试,但您可能可以试试这个:

cset shield -e "$(which java) -cp <CLASSPATH> PROGRAM"

其中&lt;CLASSPATH&gt; 需要替换为实际的类路径。

【讨论】:

  • 这消除了指定完整路径的需要,但NoClassDefFoundException 仍然存在。而且我需要在cset shield提供的环境下运行,而不是普通的shell。
  • @wmjdgla:我已经编辑了我的答案,以展示我将尝试解决CLASSPATH 问题的方法。同样,该命令将在 cset shield 下运行,而不是在普通 shell 下运行。
  • 现在显示“没有这样的文件或目录”。
  • 我在我的顶级帖子中添加了一些新的发展。
【解决方案2】:
cset shield -e $(java PROGRAM)

subshel​​l $() 似乎比反引号 `` 用于 shell 替换更好 (在里面运行命令并返回标准输出)

更多信息见

http://tldp.org/LDP/abs/html/commandsub.html

【讨论】:

  • 但是使用子shell意味着我不会在cset shield环境下运行...
  • 抱歉,我在查看之前的答案时误会了您的问题,您仍然应该注意 $() 对于返回您运行的命令的字符串可能更好。
【解决方案3】:

您是否尝试过以下方法?

cset shield -e `java PROGRAM`

【讨论】:

  • 反引号在子shell中运行它们的内容并评估该命令的输出。这不会在cset shield环境下运行java,而是在正常环境下运行java,然后尝试在cset下运行java返回的任何东西。
  • 我明白了,这不是我需要的。
猜你喜欢
  • 2016-04-24
  • 1970-01-01
  • 2012-09-25
  • 2020-10-03
  • 2021-03-22
  • 2014-08-06
  • 2018-10-22
  • 1970-01-01
相关资源
最近更新 更多