Terminal'deki bir programın yolunu nasıl bulabilirim?


26

Bir uygulama yükledim ve şimdi myapplication olarak terminal üzerinden erişebiliyorum. Yine de bu bir takma ad. Dosyanın tam yolunu nasıl bulabilirim?

Yanıtlar:


30

Sen kullanabilirsiniz typeve whichbelirli bir komut ne olduğunu belirlemek için bashonu bulunduğu bir uygulama, eğer, ve.

$ 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

Komutlar whichve elbette type -Psadece programlarınız için çalışır PATH, ancak yine de komut adlarını yazarak başkalarını çalıştıramazsınız.


Bir OS X (GUI) uygulama paketinin nereye kurulduğunu belirlemenin basit bir yolunu arıyorsanız (örneğin openkomut tarafından kullanıldığı gibi ), komut satırından aşağıdaki kısa AppleScript'i yürütebilirsiniz:

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

Bu, söz konusu programın (örnekte Safari) çalışmasını gerektirir.


1
Osascript'inizle aynı sonucu elde etmenin bir yolu var mı, ancak program çalışmıyor mu?
Mathieu Westphal

3

Bu, şu anda OSX ve Linux'ta Firefox uygulama dizinini bulmak için kullandığım yöntemdir. Başka bir uygulamaya geçmesi kolay olmalıdır. OSX 10.7, Ubuntu 12.04, Debian Jessie üzerinde test edildi

#!/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

Bu etkileyici bir kod aynası. Bunu yapan typeve type -Pyapmayan bir şey var mı? OSX dışı kod OS X'te çalışıyor mu? Değilse, neden olmadığını açıklayabilir misiniz? Evet ise, neden iki versiyonunuz var?
G-Man

1
@ G-Man: Due karakter sınırlamaları nedeniyle, iki bölümden bu cevap olacak ... On OSX, 3. parti uygulamalar için yüklü olmayan /binveya /usr/bin, vs yerine monte /Applications/My3rdPartyApp.appve ikili bir alt dizinde saklanır Contents/MacOSbunu oldukça yapma uygulamanın konumunu belirlemek için herhangi bir çapraz platform tekniklerini kullanmak zor (bu nedenle kullanımı lsregister) Daha da kötüsü, OSX dizin yapısı ikili dosyayı kaynaklardan ayrı bir konuma yerleştirir. Yukarıdaki snippet, Firefox'un defaults/prefyönünü bulmanıza yardımcı olmak için yazılmıştır .
tresf

Ubuntu'da, /usr/bin/firefoxaslında Firefox ikili değil, bu yüzden readlinkişaret ettiği yeri bulmak ve sonra defaluts/prefsdizini oradan bulmak için çıktısını kullanıyorum . Yan notta, sembolik bağlantı hakkında: Bunu yapmak ls -al /usr/bin/* |grep -- '->' |wc -l, bu dizindeki yaklaşık 303 ikili dosyayı gösterir, Ubuntu yapılandırmam aslında sembolik bağlantılardır. (yaklaşık% 16) Bu nedenle, yukarıdaki kod **, ikilinin kanonik yolunu bulana kadar sembolik bağlantıları yinelemeli olarak çözmek için değiştirilmelidir.
tresf

Son olarak, type -Psoruyu cevaplamak için, soruyu cevaplayacak bu komuta yeterince aşina değilim. Belki biraz ayrıntılandırabilirsiniz. :)
tresf

Detaylı cevap için teşekkürler. (Sen isteyebilirsiniz düzenlemek bilgi o içine Cevabınız.) Bahsetmek typeilk (ve kabul) cevap temeli olduğu için. Komut olarak kullanıldığında, belirtilen adların nasıl yorumlanacağını gösteren bir kabuk yerleşiğidir. Oldukça çıplak kemik olan POSIX sürümü burada açıklanmaktadır . … (Devam ediyor)
G-Man


0

$PATHDeğişkende ikili dosyaların yoluna başvurulur .

İçeriğini ile görebilirsiniz env.


os hatası ... üzgünüm: '(
user209678

Cevabınız tamamen açık değil, üzgünüm. Ne demek "hata içinde os… özür dilerim"? Ayrıca $PATHile görülebilir env, ancak echo $PATHdaha az ayrıntılı olacaktır.
slhck

0

Tüm takma adlarınızı listelemek için terminaldeki " takma ad " komutunu kullanabilirsiniz . Veya bir dizindeyseniz , geçerli yolunuzu göstermek için " pwd " kullanabilirsiniz.

Dosya adını veya dosya adının bir bölümünü biliyorsanız, dosyanızı bulmak için " find " kullanabilirsiniz.

find / -name things.jpeg

0

MAC (OS X) üzerinde şunları yapabilirsiniz:

  1. Uygulamayı Finder'da bulun.
  2. Uygulamayı sağ tıklayın ve "Paket İçeriğini Göster" i seçin.
  3. Yürütülebilir dosyayı bulun: Genellikle, bu İçindekiler → MacOS'tadır ve uygulama ile aynı ada sahiptir.
  4. Bu dosyayı boş Terminal komut satırınıza sürükleyin.

Artık komut satırında uygulamanızın tam yolunu görebilir ve isterseniz oradan çalıştırabilirsiniz.

Alındığı wikiHow'daki

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.