如何知道特定软件的路径?


13

上下文:我正在尝试使应用程序在登录时自动启动。为此,我需要path为应用程序选择。

在此处输入图片说明

这是我已经研究过的路径:

  • /sbin
  • /usr/sbin
  • /usr/local/bin
  • /usr/share/

如果这可能有帮助,我尝试查找的应用程序称为“ ScreenCloud ”,我从Ubuntu软件中心下载了该应用程序。

但是我找不到它,有什么办法可以知道特定软件的安装位置?因为即使我找到了这个,也希望将来避免遇到同样的问题。


2
如果仅在命令行中输入screencloud,那不起作用吗?
格雷厄姆

您是从快照存储区还是从Ubuntu软件中心获得的,因为我无法在任何Ubuntu apt存储库中找到它。
mchid

2
@mchid我没有处理OP的链接,而是您的评论:“因为我无法在任何Ubuntu apt储存库中找到它”,可以从.deb软件包中安装Screencloud,但您需要添加PPA。
WinEunuuchs2Unix

1
@mchid我知道命令已从更改为screencloud.shscreencloud并怀疑它已移出/opt。我的回答的那一部分指出如何typewhich不会发现screencloud,但locate会。
WinEunuuchs2Unix

1
@ WinEunuuchs2Unix正确。screencloud.sh实际上仍然存在,但是screencloud除了.sh文件是脚本而screencloud不是脚本之外,我不确定它与其他文件有何不同。我真的不熟悉此应用程序。在下面/usr/bin/有一个screencloud,一个screencloud.sh,以及一个screencloud-后跟版本号,就像gimp是这样。
mchid

Answers:


16

查找可执行文件的路径

最好的办法

  • type executable

请查看此问题,以了解有关如何type更好的更多信息。(谢谢,发表评论!)

其他方法

  • whereis executable
  • which executable

这些命令仅在PATH变量(echo $PATH)中搜索,因此在某些情况下(内置函数,别名或bash函数等)无效。


3
令人难以置信的是,这还不是问ubuntu的问题。好问题@Ced!
tatsu

的确,我简直不敢相信!
Biggybi,

1
我从另一个问题中发现了一个type更可取的问题,which因为它是内置的shell,可以确定命令是否为别名。这对我来说也是新的!
Arronical

1
请参阅此处,以了解(为什么)type被首选:为什么不使用“哪个”?那要用什么呢?
特登

1
@mchid答案中的点均适用。包括“用例”部分,该部分指出which在Shell脚本的特定上下文中确实有用。但是,在这种情况之外,type几乎总是更好的选择。

1

查找路径内部或外部的命令位置

假设您要查找uname列出系统信息的程序的位置。如果您想知道顶级命令存储在哪个目录中,则可以使用多种选择:

$ which uname
/bin/uname

$ type -a uname
uname is /bin/uname

$ command -v uname
/bin/uname

$ locate uname
/bin/uname
    (... SNIP dozens of Windows files on C & D ...)
/usr/lib/klibc/bin/uname
/usr/lib/plainbox-provider-resource-generic/bin/uname_resource
/usr/share/man/man1/uname.1.gz
/usr/share/man/man2/oldolduname.2.gz
/usr/share/man/man2/olduname.2.gz
/usr/share/man/man2/uname.2.gz

定位优势

最后一个选项locate返回所有文件,这些文件不仅包含uname从命令提示符处运行的程序。

这样做的好处locate是它将查找不在您的搜索路径中的命令。type -a(优先于simple type),并且which只会在您的搜索路径中找到命令。要查看搜索路径,请使用echo $PATH

例如,如何启动screencloud中的答案

尝试...

/opt/screencloud/screencloud.sh

locate screencloud命令将找到它,但which screencloudtype -a screencloud不会因为:

  • 全名是screencloud.sh,只有locate命令会在部分匹配时进行搜索。
  • /opt/screencloud可能不在搜索路径中。which并且type仅在搜索路径中查找可执行文件。

注意:这是一个较旧的答案。现代ScreenCloud称为screencloud

与该find命令相比,Locate的优势在于它可以快数百倍甚至数千倍。同样find从开始运行/将给您带来许多您不会遇到的权限错误locate

找出劣势

如果您今天才安装该程序,则需要使用它sudo updatedb来更新locate的数据库。


1

使用以下命令列出所有$PATH目录:

echo $PATH | sed 's/:/\n/g'

使用以下命令查找以下内容的完整路径screencloud

for i in $(echo $PATH | sed 's/:/\n/g'); do find $i/screencloud* 2>@1; done

如果您使用aptapt-get或Ubuntu软件中心安装软件包,则可以使用以下命令查找完整路径:

dpkg -L screencloud | grep bin

假设你使用这个库,你应该能够找到screencloud/usr/bin/

完整路径为:

/usr/bin/screencloud

要么

/usr/bin/screencloud-*

但是,如果您根据问题中提供链接使用了snapcraft存储,则该路径将位于以下目录中:

/snap/bin

更多信息

另外,请记住,Ubuntu区分大小写,因此您必须使用所有小写字母且没有大写字母。


感谢您提供非常详细的答案,您赢得了
投票

1
它实际上在下/snap/bin
Ced
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.