我目前正试图在我的Ubuntu20.04机器上安装ghidra。在安装过程中,我得到以下信息:
******************************************************************
JDK 11+ (64-bit) could not be found and must be manually chosen!
******************************************************************
Enter path to JDK home directory (ENTER for dialog): 所以,我觉得很酷,然后跑:
sudo apt-get install openjdk-11-jdk如果我现在运行whereis java:
/usr/share/java$ whereis java
java: /usr/bin/java /usr/share/java /usr/share/man/man1/java.1.gz所以我光盘到第一个目录,ans看:
/usr/share/java$ ls
commons-logging-1.2.jar java-atk-wrapper.jar pdfbox-1.8.16.jar
commons-logging-adapters-1.2.jar java_defaults.mk pdfbox.jar
commons-logging-adapters.jar java_uno.jar ridl-6.4.7.jar
commons-logging-api-1.2.jar juh-6.4.7.jar ridl.jar
commons-logging-api.jar juh.jar unoloader-6.4.7.jar
commons-logging.jar jurt-6.4.7.jar unoloader.jar
fontbox-1.8.16.jar jurt.jar
fontbox.jar libintl.jar这里有一堆jar文件?通常jdk有一个bin文件夹,等等?
我还尝试将/usr/share/java提供给ghidra安装,但是它抱怨说这不是一个有效的jdk主目录,因为它缺少一个bin文件夹。
发布于 2021-05-08 13:33:51
由于您以前曾使用whereis检查您的二进制文件是否已安装,现在您可以检查它是否可以正确执行:
which java,它应该返回类似于/usr/bin/java的内容java -version显示其版本,它应该显示如下所示openjdk version "11.0.11" 2021-04-20
OpenJDK Runtime Environment (build 11.0.11+9-Ubuntu-0ubuntu2.20.04)
OpenJDK 64-Bit Server VM (build 11.0.11+9-Ubuntu-0ubuntu2.20.04, mixed mode, sharing)JAVA_HOME环境变量。然后,可以将其设置为java安装的home dir,例如JAVA_HOME=/usr/lib/jvm/java-11-openjdk-amd64。为了帮助您检索java主路径,您可以使用which java | xargs realpath,它提供了类似于/usr/lib/jvm/java-11-openjdk-amd64/bin/java的路径(或者您可以在which提供的路径上多次使用ls -l ),您需要从该路径中删除最新的部分/bin/java。
PS :如果您需要系统上的几个java运行时,那么路径解析和JAVA_HOME必须匹配相同的版本。在方便的情况下,您可以解压缩/my/定制/install/jdk15 15/等任何文件夹中的任何特定版本,并覆盖系统路径:
export JAVA_HOME=/my/custom/install/jdk15
export PATH=$JAVA_HOME/bin:$PATH在我的系统中,我使用如下命令在我的.bashrc中设置了.bashrc:
export JAVA_HOME=`dirname $(dirname $(readlink -f $(which java)))`
export PATH=$JAVA_HOME/bin:$PATH发布于 2021-07-07 17:55:43
首先,确保通过运行java --version正确地完成了安装,您应该看到如下所示:

然后,为了找到jdk文件夹,运行下面的命令:
readlink -f $(which java) 它返回路径,在我的例子中,它返回:
/usr/lib/jvm/java-11-openjdk-amd64 64/bin/java
您可以运行ls /usr/lib/jvm/java-11-openjdk-amd64,它将显示jdk文件夹内容。它看起来就像:

第一个whereis!就像which不解析符号链接一样!
which java =>给出命令路径=>将符号链接返回给符号链接
debian中的示例:
/usr/bin/java =符号链接to=> /etc/alternatives/java =符号链接to=> /usr/lib/jvm/java-10-openjdk-amd64/bin/java
/usr/lib/jvm/java-10-openjdk-amd64/bin/java是实际的java二进制文件!而/usr/lib/jvm/java-10-openjdk-amd64是java的主页。
如果你想用的话!一个需要解决的符号链接!这里是递归的!
Symlink => Symlink =>实际文件夹或文件
我们可以通过读链接来做到这一点。
https://man7.org/linux/man-pages/man1/readlink.1.html
https://www.geeksforgeeks.org/readlink-command-in-linux-with-examples/
readlink -打印解析的符号链接或规范文件名
总之!如果你有一个符号链接!
readlink symbolicLink =>会给出它决心要做的
给定Symlink1 => Symlink2 => path
readllink Symlink1 =return=> Symlink2
readlink Symlink2 =return=>路径
在这里,让我们看看java:

一条命令

是啊,太丑了!
还有更好的!使用-f标志
从帮助医生那里
-f, --canonicalize canonicalize by following every symlink in
every component of the given name recursively;
all but the last component must exist所以:
readlink -f $(which java)重新解析符号链接!

你也可以通过这里使用它!

您可以看到并找到您的主目录!
在这个上下文中使用which!总比这里好!
which和whereis之间的区别!让我们使用whatis
$ whatis which
which (1) - shows the full path of (shell) commands
$ whatis whereis
whereis (1) - locate the binary, source, and manual page files for a command发布于 2021-05-08 14:00:11
whereis和find命令的另一个替代方法是locate命令。它非常快:
$ locate openjdk | head -n10
/home/rick/Android/Sdk/sources/android-28/org/openjdk
/home/rick/Android/Sdk/sources/android-28/org/openjdk/testlib
/home/rick/Android/Sdk/sources/android-28/org/openjdk/testlib/java
/home/rick/Android/Sdk/sources/android-28/org/openjdk/testlib/java/util
/home/rick/Android/Sdk/sources/android-28/org/openjdk/testlib/java/util/stream
/home/rick/Android/Sdk/sources/android-28/org/openjdk/testlib/java/util/stream/CollectorOps.java
/home/rick/Android/Sdk/sources/android-28/org/openjdk/testlib/java/util/stream/DoubleStreamTestDataProvider.java
/home/rick/Android/Sdk/sources/android-28/org/openjdk/testlib/java/util/stream/DoubleStreamTestScenario.java
/home/rick/Android/Sdk/sources/android-28/org/openjdk/testlib/java/util/stream/FlagDeclaringOp.java
/home/rick/Android/Sdk/sources/android-28/org/openjdk/testlib/java/util/stream/IntStreamTestDataProvider.java这是第一个包含openjdk的10个文件处理程序。您可以使用wc (word count)命令使用-l (行计数)参数快速定位和计数文件数:
$ time locate java | wc -l
57555
real 0m0.945s
user 0m0.927s
sys 0m0.021s
$ time locate openjdk | wc -l
72
real 0m1.053s
user 0m1.033s
sys 0m0.021s所以文件名中有57,555个带有java的文件,在文件名中有72个带有openjdk的文件。在这两种情况下,都需要大约1秒的时间才能找到它们。
要真正了解locate命令的速度,请考虑搜索哪个文件名包含字母e,这是字母表中最常见的字母:
$ time locate e | wc -l
2283738
real 0m0.580s
user 0m0.592s
sys 0m0.177s有2,228,738个文件的字母e出现在他们的文件名至少一次。这是为三个Ubuntu安装,一个Windows安装和一个共享Ubuntu + Windows分区。只需1/2每秒就能找到他们!
您可能必须首先安装locate命令:
https://askubuntu.com/questions/1336818
复制相似问题