답변:
사용 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
물론,하지만 당신은 어쨌든 자신의 명령 이름을 입력하여 다른 사람을 실행할 수 없습니다.
open
명령 과 같이 OS X (GUI) 응용 프로그램 번들이 설치된 위치를 결정하는 간단한 방법을 찾고 있다면 명령 줄에서 다음과 같은 짧은 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 개의 바이너리를 설명 하면 내 우분투 구성이 실제로 심볼릭 링크입니다. (이들 중 약 16 %) 이런 이유로, 위의 코드 **는 결국 바이너리에 대한 정식 경로를 찾을 때까지 심볼릭 링크를 재귀 적으로 해결하도록 수정해야합니다.
type -P
질문에 대답하기 위해 질문에 대답하는 명령에 익숙하지 않습니다. 아마도 당신은 조금 정교하게 할 수 있습니다. :)
type
이진 경로는 $PATH
변수 에서 참조됩니다 .
당신은 그것의 내용을 볼 수 있습니다 env
.
$PATH
로 볼 수 env
있지만 echo $PATH
덜 장황합니다.