Bagaimana cara menemukan jalur ke program di Terminal?

26

Saya menginstal aplikasi dan sekarang saya dapat mengaksesnya melalui terminal sebagai aplikasi saya. Itu adalah alias. Bagaimana saya bisa menemukan path lengkap ke file?

Xitrum
sumber

Jawaban:

30

Anda dapat menggunakan typedan whichuntuk menentukan apa perintah tertentu bash, dan, jika itu adalah aplikasi, di mana ia berada.

$ 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

Perintah whichdan type -Phanya berfungsi untuk program pada Anda PATH, tentu saja, tetapi Anda tidak akan dapat menjalankan yang lain hanya dengan mengetikkan nama perintah mereka.


Jika Anda mencari cara sederhana untuk menentukan di mana bundel aplikasi OS X (GUI) diinstal (seperti yang digunakan misalnya dengan openperintah), Anda dapat menjalankan AppleScript pendek berikut dari baris perintah:

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

Ini mensyaratkan bahwa program yang dipermasalahkan (Safari dalam contoh) berjalan.

Daniel Beck
sumber
1
Apakah ada cara untuk mendapatkan hasil yang sama dengan naskah Anda tetapi tanpa program berjalan?
Mathieu Westphal
3

Ini adalah metode yang saya gunakan saat ini untuk mencari direktori aplikasi Firefox di OSX dan Linux. Harus mudah diadopsi ke aplikasi lain. Diuji pada 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
tresf
sumber
Itu potongan kode yang mengesankan. Apakah itu melakukan sesuatu itu typedan type -Ptidak? Apakah kode non-OSX berfungsi pada OS X? Jika tidak, dapatkah Anda menjelaskan mengapa tidak? Jika ya, mengapa Anda memiliki dua versi?
G-Man Mengatakan 'Reinstate Monica'
1
@ G-Man: Karena keterbatasan karakter, saya akan menjawab ini dalam dua bagian ... Pada OSX, aplikasi pihak ke-3 tidak diinstal ke /binatau /usr/bin, dll melainkan diinstal ke /Applications/My3rdPartyApp.appdan biner disimpan dalam subdirektori Contents/MacOSsehingga cukup sulit untuk menggunakan teknik lintas-platform untuk menentukan lokasi aplikasi (karenanya penggunaan lsregister) Lebih buruk lagi, struktur direktori OSX menempatkan biner di lokasi yang terpisah dari sumber daya. Cuplikan di atas ditulis untuk membantu menemukan defaults/prefdirektori Firefox .
tresf
Di Ubuntu, /usr/bin/firefoxsebenarnya bukan binari Firefox, jadi saya menggunakan output readlinkuntuk menemukan di mana ia menunjuk, dan kemudian menemukan defaluts/prefsdirektori dari sana. Di samping catatan, tentang symlinking: Melakukan ls -al /usr/bin/* |grep -- '->' |wc -lmenggambarkan sekitar 303 binari di direktori itu konfigurasi Ubuntu saya sebenarnya symlinks. (sekitar 16% dari mereka) Untuk alasan ini, kode di atas ** pada akhirnya * harus dimodifikasi untuk menyelesaikan symlink secara rekursif sampai menemukan jalur kanonik ke biner.
tresf
Terakhir, untuk menjawab type -Ppertanyaan, saya tidak cukup akrab dengan perintah itu untuk menjawab pertanyaan. Mungkin Anda bisa sedikit menguraikan. :)
tresf
Terima kasih atas respon yang mendetail. (Anda mungkin ingin mengedit informasi itu menjadi jawaban Anda.) Saya sebutkan typekarena itu adalah dasar dari jawaban pertama (& diterima). Ini adalah builtin shell yang menunjukkan bagaimana nama yang ditentukan akan ditafsirkan jika digunakan sebagai perintah. Versi POSIX-nya, yang agak sederhana, dijelaskan di sini . … (Lanjutan)
G-Man Mengatakan 'Reinstate Monica'
3

Jika program sedang berjalan, hubungi

ps -ef | grep PROGRAMM
Matthias M
sumber
0

Path binari direferensikan dalam $PATHvariabel.

Anda dapat melihat isinya dengan env.

pengguna209678
sumber
kesalahan di os ... maaf: '(
user209678
Jawaban Anda tidak sepenuhnya jelas, maaf. Apa yang Anda maksud dengan "kesalahan dalam os ... maaf"? Juga $PATHdapat dilihat dengan env, tetapi echo $PATHakan kurang bertele-tele.
slhck
0

Anda dapat menggunakan perintah " alias " di terminal untuk mendaftar semua alias Anda. Atau jika Anda berada di direktori, Anda dapat menggunakan " pwd " untuk menunjukkan jalur Anda saat ini.

Jika Anda tahu nama file atau bagian nama file, maka Anda dapat menggunakan " find " untuk mencari file Anda.

find / -name things.jpeg
Steve Butabi
sumber
0

Pada MAC (OS X) yang dapat Anda lakukan:

  1. Temukan aplikasi di Finder.
  2. Klik kanan aplikasi dan pilih "Tampilkan Isi Paket."
  3. Temukan file yang dapat dieksekusi: Biasanya, ini ada dalam Daftar Isi → MacOS, dan memiliki nama yang sama dengan aplikasi.
  4. Seret file itu ke baris perintah Terminal kosong Anda.

Sekarang Anda dapat melihat path lengkap ke aplikasi Anda pada baris perintah dan menjalankannya dari sana jika Anda mau.

Diambil dari wikihow

Alex Sed
sumber