如何在 Linux 中解析“whereis”输出以获得所需的路径?

Chr*_*s F 0 bash awk

任何人都有 bash 或 awk one-liner 来解析此命令的输出?

# whereis java
java: /usr/bin/java /usr/local/openjdk-8/bin/java
Run Code Online (Sandbox Code Playgroud)

所以它返回,在这种情况下,路径/usr/local/openjdk-8?IOW,是什么some_script

# whereis java | some_script
/usr/local/openjdk-8
Run Code Online (Sandbox Code Playgroud)

我知道至少要这样做,但现在只是为了得到 /usr/local/openjdk-8

# whereis java | awk '{print($3)}'
/usr/local/openjdk-8/bin/java
Run Code Online (Sandbox Code Playgroud)

根据 Charles Duffy 的建议更新/编辑

使用这个命令

# type -P -a java
/usr/local/openjdk-8/bin/java
Run Code Online (Sandbox Code Playgroud)

我怎样才能用管道来得到这个?IOW,是什么some_script

# type -P -a java | some_script
/usr/local/openjdk-8
Run Code Online (Sandbox Code Playgroud)

Cha*_*ffy 5

whereis不是 POSIX 标准化的,也不是 bash 本身的一部分。因此,它是一项特别糟糕的工作工具。

我强烈建议使用 shell-builtintype命令。如果您的目标是javaPATH查找期间找到第二个副本的顶级目录,则:

{ read _; read -r java_loc; } < <(type -P -a java)
echo "Java was found at $java_loc"
Run Code Online (Sandbox Code Playgroud)

一旦你明白了,剥离/bin/java就是一个简单的参数扩展(${var%suffix}var之前的所有内容suffix):

{ read _; read -r java_loc; } < <(type -P -a java)
java_parent_loc=${java_loc%/bin/java}
echo "Java was found under ${java_parent_loc}"
Run Code Online (Sandbox Code Playgroud)

也就是说,我绝不建议将其作为设置您的方式的一种方式JAVA_HOME- 它非常不必要地脆弱,对您的PATH订单做出的假设不能保证是有充分根据的。

  • 将换行符替换为 `;`s 和 bam(单行)。 (4认同)