Answers:
您可以使用type
和which
确定其中的某个命令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
命令which
和type -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)正在运行。
这是我目前在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上使用吗?如果没有,您能解释为什么吗?如果是,为什么会有两个版本?
/bin
或/usr/bin
等而是安装/Applications/My3rdPartyApp.app
和二进制存储在一个子目录Contents/MacOS
制作得相当很难使用任何跨平台技术来确定应用程序的位置(因此使用lsregister
)。更糟糕的是,OSX目录结构将二进制文件放置在与资源不同的位置。上面的代码段旨在帮助查找Firefox的defaults/pref
目录。
/usr/bin/firefox
实际上不是Firefox二进制文件,因此我使用的输出readlink
来定位它指向的位置,然后defaluts/prefs
从那里找到目录。附带一提,关于符号链接:这样做ls -al /usr/bin/* |grep -- '->' |wc -l
说明了该目录中的303个二进制文件,而我的Ubuntu配置实际上是符号链接。(约占其中的16%)因此,上述代码**应该*最终应进行修改,以递归地解析符号链接,直到找到通往二进制文件的规范路径。
type -P
问题,我对该命令的回答还不够熟悉。也许您可以详细说明。:)
type
这是因为它是第一个(被接受)答案的基础。它是一个内置的shell,它指示如果用作命令,将如何解释指定的名称。这里描述了它的POSIX版本,该版本相当简陋。…(续)