터미널에서 프로그램 경로를 어떻게 찾습니까?


26

응용 프로그램을 설치했으며 이제 터미널을 통해 내 응용 프로그램으로 액세스 할 수 있습니다. 그래도 별명입니다. 파일의 전체 경로를 어떻게 찾을 수 있습니까?

답변:


30

사용 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

명령 whichtype -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)이 실행 중이어야합니다.


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

그것은 인상적인 코드입니다. 그것은 그 아무것도 할 수 있는가 typetype -P그렇지? 비 OSX 코드가 OS X에서 작동합니까? 그렇지 않은 경우 이유를 설명 할 수 있습니까? 그렇다면 왜 두 가지 버전이 있습니까?
G-Man, 'Reinstate

1
@ G-Man : 문자 제한으로 인해 두 부분으로 대답합니다 ... OSX에서 타사 응용 프로그램은 /bin또는에 설치되지 /usr/bin않지만 대신 설치되며 /Applications/My3rdPartyApp.app바이너리는 하위 디렉토리에 저장되어 Contents/MacOS있습니다. 크로스 플랫폼 기술을 사용하여 응용 프로그램의 위치를 ​​결정하기 어렵 기 때문에 (따라서 사용 lsregister) 최악의 경우, OSX 디렉토리 구조는 바이너리를 리소스와 별도의 위치에 둡니다. 위의 스 니펫은 Firefox의 defaults/pref디렉토리 를 찾는 데 도움이되도록 작성되었습니다 .
tresf

우분투에서는 /usr/bin/firefox실제로 Firefox 바이너리가 아니기 때문에 출력을 사용하여 readlink가리키는 위치를 찾은 다음 defaluts/prefs거기 에서 디렉토리 를 찾습니다 . 참고 사항 : ls -al /usr/bin/* |grep -- '->' |wc -l심볼릭 링크에 대한 참고 사항 : 해당 디렉토리에서 약 303 개의 바이너리를 설명 하면 내 우분투 구성이 실제로 심볼릭 링크입니다. (이들 중 약 16 %) 이런 이유로, 위의 코드 **는 결국 바이너리에 대한 정식 경로를 찾을 때까지 심볼릭 링크를 재귀 적으로 해결하도록 수정해야합니다.
tresf

마지막으로 type -P질문에 대답하기 위해 질문에 대답하는 명령에 익숙하지 않습니다. 아마도 당신은 조금 정교하게 할 수 있습니다. :)
tresf

자세한 답변 감사합니다. (당신은 그 정보 당신의 답변 으로 편집 하고 싶을 것입니다.) 나는 그것이 첫 번째 (그리고 받아 들인) 답변의 기초이기 때문에 언급 했습니다. 명령으로 사용되는 경우 지정된 이름을 해석하는 방법을 나타내는 셸 내장입니다. 뼈대가 아닌 POSIX 버전이 여기 에 설명되어 있습니다 . … (계속)type
G-Man, 'Reinstate


0

이진 경로는 $PATH변수 에서 참조됩니다 .

당신은 그것의 내용을 볼 수 있습니다 env.


os에서 오류가 발생했습니다 ... 죄송합니다 : '(
user209678

대답이 명확하지 않습니다. 죄송합니다. "os in error ... 죄송합니다"는 무슨 뜻입니까? 또한 $PATH로 볼 수 env있지만 echo $PATH덜 장황합니다.
slhck

0

터미널에서 " alias "명령을 사용 하여 모든 별칭을 나열 할 수 있습니다 . 또는 디렉토리에있는 경우 " pwd "를 사용 하여 현재 경로를 표시 할 수 있습니다 .

파일 이름이나 파일 이름의 일부를 알고 있다면 " 찾기 "를 사용 하여 파일을 찾을 수 있습니다.

find / -name things.jpeg

0

MAC (OS X)에서 다음을 수행 할 수 있습니다.

  1. Finder에서 응용 프로그램을 찾으십시오.
  2. 응용 프로그램을 마우스 오른쪽 단추로 클릭하고 "패키지 내용 표시"를 선택하십시오.
  3. 실행 파일을 찾습니다. 일반적으로이 파일은 목차 → MacOS에 있으며 응용 프로그램과 이름이 같습니다.
  4. 해당 파일을 빈 터미널 명령 줄로 드래그하십시오.

이제 명령 행에서 응용 프로그램의 전체 경로를보고 원하는 경우 여기에서 실행할 수 있습니다.

Wikihow 에서 가져온

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.