如何在终端中找到程序的路径?


26

我安装了一个应用程序,现在可以作为我的应用程序通过终端访问它。不过,这是一个别名。如何找到文件的完整路径?

Answers:


30

您可以使用typewhich确定其中的某个命令bash是什么,如果是应用程序,则可以确定它所在的位置。

$ type type
type is a shell builtin
$ type cd
cd is a shell builtin
$ type ls
ls is aliased to `ls --color=auto'
$ type -P ls
/Users/danielbeck/bin/ls
$ which which
/usr/bin/which
$ which ls
/Users/danielbeck/bin/ls

命令whichtype -P对你的程序唯一的工作PATH,当然,但你将无法通过只输入其命令名称反正运行等。


如果您正在寻找一种确定OS X(GUI)应用程序包安装位置的简单方法(例如,该open命令所使用的方法),则可以从命令行执行以下简短的AppleScript:

$ osascript -e 'tell application "System Events" to POSIX path of (file of process "Safari" as alias)'
/Applications/Safari.app

这要求相关程序(在示例中为Safari)正在运行。


1
有没有办法获得与您的osascript相同的结果,但不运行程序?
Mathieu Westphal

3

这是我目前在OSX和Linux中找到Firefox应用程序目录的方法。应该易于被其他应用采用。在OSX 10.7,Ubuntu 12.04,Debian Jessie上测试

#!/bin/bash

# Array of possible Firefox application names.
appnames=("IceWeasel" "Firefox")    # "Firefox" "IceWeasel" "etc

#
# Calls lsregister -dump and parses the output for "/Firefox.app", etc.
# Returns the very first result found.
#
function get_osx_ffdir()
{
    # OSX Array of possible lsregister command locations
    # I'm only aware of this one currently
    lsregs=("/System/Library/Frameworks/CoreServices.framework/Versions/A/Frameworks/LaunchServices.framework/Versions/A/Support/lsregister")

    for i in "${lsregs[@]}"; do
        for j in ${appnames[@]}; do
            if [ -f $i ]; then
                # Some logic to parse the output from lsregister
                ffdir=$($i -dump |grep -E "/$j.app$" |cut -d'/' -f2- |head -1)
                ffdir="/$ffdir"
                return 0
            fi
        done
    done
    return 1
}

#
# Uses "which" and "readlink" to locate firefox on Linux, etc
#
function get_ffdir()
{
    for i in "${appnames[@]}"; do
        # Convert "Firefox" to "firefox", etc
        lower=$(echo "$i" |tr '[:upper:]' '[:lower:]')
        # Readlink uses the symlink to find the actual install location
        # will need to be removed for non-symlinked applications
        exec=$(readlink -f "$(which $lower)")
        # Assume the binary's parent folder is the actual application location
        ffdir=$(echo "$exec" |rev |cut -d'/' -f2- |rev)
        if [ -f "$ffdir" ]; then
            return 0
        fi
    done
    return 1

}


echo "Searching for Firefox..."

ffdir=""
if [[ "$OSTYPE" == "darwin"* ]]; then
    # Mac OSX
    get_osx_ffdir
else
    # Linux, etc
    get_ffdir
fi

echo "Found application here: $ffdir"

# TODO: Process failures, i.e. "$ffdir" == "" or "$?" != "0", etc

这是令人印象深刻的代码。它做任何事情,type并且type -P不?非OSX代码可以在OS X上使用吗?如果没有,您能解释为什么吗?如果是,为什么会有两个版本?
G-Man说'恢复莫妮卡'

1
@ G-人:由于字符限制,我会分两部分回答这个问题......在OSX,第三方应用程序未安装到/bin/usr/bin等而是安装/Applications/My3rdPartyApp.app和二进制存储在一个子目录Contents/MacOS制作得相当很难使用任何跨平台技术来确定应用程序的位置(因此使用lsregister)。更糟糕的是,OSX目录结构将二进制文件放置在与资源不同的位置。上面的代码段旨在帮助查找Firefox的defaults/pref目录。
tresf 2015年

在Ubuntu上,/usr/bin/firefox实际上不是Firefox二进制文件,因此我使用的输出readlink来定位它指向的位置,然后defaluts/prefs从那里找到目录。附带一提,关于符号链接:这样做ls -al /usr/bin/* |grep -- '->' |wc -l说明了该目录中的303个二进制文件,而我的Ubuntu配置实际上是符号链接。(约占其中的16%)因此,上述代码**应该*最终应进行修改,以递归地解析符号链接,直到找到通往二进制文件的规范路径。
tresf,2015年

最后,要回答这个type -P问题,我对该命令的回答还不够熟悉。也许您可以详细说明。:)
tresf,2015年

感谢您的详细回复。(您可能希望将这些信息编辑您的答案。)我提到type这是因为它是第一个(被接受)答案的基础。它是一个内置的shell,它指示如果用作命令,将如何解释指定的名称。这里描述了它的POSIX版本,该版本相当简陋。…(续)
G-Man说“恢复莫妮卡”


0

二进制文件的路径在$PATH变量中引用。

您可以使用查看内容env


OS中的错误...抱歉:'(
2013年

抱歉,您的答案并不完全清楚。“操作系统错误...抱歉”是什么意思?也$PATH可以使用查看env,但echo $PATH不会那么冗长。
slhck

0

您可以在终端中使用“ alias ”命令列出所有别名。或者,如果您在目录中,则可以使用“ pwd ”显示当前路径。

如果您知道文件名或文件名的一部分,则可以使用“ find ”查找文件。

find / -name things.jpeg

0

在MAC(OS X)上,您可以执行以下操作:

  1. 在Finder中找到该应用程序。
  2. 右键单击该应用程序,然后选择“显示软件包内容”。
  3. 找到可执行文件:通常,这在目录→MacOS中,并且与应用程序名称相同。
  4. 将该文件拖到空白的Terminal命令行上。

现在,您可以在命令行上查看应用程序的完整路径,并根据需要从那里运行它。

摘自Wikihow

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.