ฉันจะค้นหาเส้นทางไปยังโปรแกรมใน Terminal ได้อย่างไร


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

คำสั่ง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 ในตัวอย่าง) กำลังทำงาน


1
มีวิธีการรับผลเช่นเดียวกับ osascript ของคุณ แต่ไม่มีโปรแกรมทำงานหรือไม่
Mathieu Westphal

3

นี่คือวิธีที่ฉันใช้เพื่อค้นหาไดเรกทอรีแอปพลิเคชัน Firefox ใน OSX และ Linux ควรนำไปใช้กับแอปพลิเคชันอื่นได้ง่าย ทดสอบบน 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 ได้หรือไม่ ถ้าไม่คุณสามารถอธิบายได้ว่าทำไมไม่ ถ้าใช่ทำไมคุณมีสองเวอร์ชั่น
G-Man พูดว่า 'Reinstate Monica'

1
@ G-Man: เนื่องจากข้อ จำกัด ของตัวละครฉันจะตอบคำถามนี้ในสองส่วน ... ใน OSX แอปพลิเคชันบุคคลที่สามไม่ได้ติดตั้ง/binหรือ/usr/binอื่น ๆ แต่ติดตั้งแทน/Applications/My3rdPartyApp.appและไบนารีจะถูกเก็บไว้ในไดเรกทอรีย่อยContents/MacOSทำให้ค่อนข้าง ยากที่จะใช้เทคนิคข้ามแพลตฟอร์มใด ๆ เพื่อกำหนดตำแหน่งของแอปพลิเคชัน (ดังนั้นการใช้lsregister) แย่กว่านั้นโครงสร้างไดเรกทอรี OSX วางไบนารีในสถานที่แยกต่างหากจากทรัพยากร ข้อมูลข้างต้นถูกเขียนขึ้นเพื่อให้ความช่วยเหลือกับตำแหน่งของ Firefox defaults/prefdir
tresf

ใน Ubuntu /usr/bin/firefoxไม่ใช่ไบนารี Firefox จริง ๆ ดังนั้นฉันใช้ผลลัพธ์ของreadlinkเพื่อค้นหาตำแหน่งที่ชี้ไปแล้วหาdefaluts/prefsไดเรกทอรีจากที่นั่น ในหมายเหตุด้านเกี่ยวกับ symlinking: การทำls -al /usr/bin/* |grep -- '->' |wc -lแสดงให้เห็นถึง 303 ไบนารีในไดเรกทอรีนั้นการตั้งค่า Ubuntu ของฉันเป็น symlink จริง (ประมาณ 16% ของพวกเขา) ด้วยเหตุผลนี้รหัสด้านบนควรได้รับการแก้ไขในที่สุดเพื่อแก้ไข symlink ซ้ำจนกว่ามันจะพบเส้นทางที่เป็นที่ยอมรับไปยังไบนารี
tresf

สุดท้ายเพื่อตอบtype -Pคำถามฉันไม่คุ้นเคยกับคำสั่งนั้นเพื่อตอบคำถาม บางทีคุณสามารถทำอย่างละเอียดเล็กน้อย :)
tresf

ขอบคุณสำหรับการตอบสนองอย่างละเอียด (คุณอาจต้องการแก้ไขข้อมูลนั้นในคำตอบของคุณ) ฉันพูดถึงtypeเพราะมันเป็นพื้นฐานของคำตอบแรก (& ยอมรับ) มันคือเชลล์บิวด์อินที่ระบุว่าจะตีความชื่ออย่างไรหากใช้เป็นคำสั่ง รุ่น POSIX ของมันซึ่งค่อนข้างเปลือยกระดูก, อธิบายไว้ที่นี่ … (ต่อ)
G-Man พูดว่า 'Reinstate Monica'


0

เส้นทางของไบนารีถูกอ้างอิงใน$PATHตัวแปร

envคุณสามารถดูเนื้อหาด้วย


ข้อผิดพลาดในระบบปฏิบัติการ ... ขออภัย: '(
user209678

คำตอบของคุณยังไม่ชัดเจนขอโทษ คุณหมายความว่าอย่างไรกับ "ข้อผิดพลาดในระบบปฏิบัติการ…ขอโทษ"? นอกจากนี้ยัง$PATHสามารถดูได้ด้วยenvแต่echo $PATHจะ verbose น้อย
slhck

0

คุณสามารถใช้คำสั่ง " นามแฝง " ในเทอร์มินัลเพื่อแสดงรายการนามแฝงทั้งหมดของคุณ หรือถ้าคุณอยู่ในไดเรกทอรีคุณสามารถใช้ " 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.