ฉันติดตั้งแอปพลิเคชันและตอนนี้ฉันสามารถเข้าถึงได้ผ่านทางเทอร์มินัลว่าเป็นแอปพลิเคชันของฉัน มันเป็นนามแฝงแม้ว่า ฉันจะค้นหาเส้นทางแบบเต็มไปยังไฟล์ได้อย่างไร
ฉันติดตั้งแอปพลิเคชันและตอนนี้ฉันสามารถเข้าถึงได้ผ่านทางเทอร์มินัลว่าเป็นแอปพลิเคชันของฉัน มันเป็นนามแฝงแม้ว่า ฉันจะค้นหาเส้นทางแบบเต็มไปยังไฟล์ได้อย่างไร
คำตอบ:
คุณสามารถใช้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 ในตัวอย่าง) กำลังทำงาน
นี่คือวิธีที่ฉันใช้เพื่อค้นหาไดเรกทอรีแอปพลิเคชัน 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 ได้หรือไม่ ถ้าไม่คุณสามารถอธิบายได้ว่าทำไมไม่ ถ้าใช่ทำไมคุณมีสองเวอร์ชั่น
/bin
หรือ/usr/bin
อื่น ๆ แต่ติดตั้งแทน/Applications/My3rdPartyApp.app
และไบนารีจะถูกเก็บไว้ในไดเรกทอรีย่อยContents/MacOS
ทำให้ค่อนข้าง ยากที่จะใช้เทคนิคข้ามแพลตฟอร์มใด ๆ เพื่อกำหนดตำแหน่งของแอปพลิเคชัน (ดังนั้นการใช้lsregister
) แย่กว่านั้นโครงสร้างไดเรกทอรี OSX วางไบนารีในสถานที่แยกต่างหากจากทรัพยากร ข้อมูลข้างต้นถูกเขียนขึ้นเพื่อให้ความช่วยเหลือกับตำแหน่งของ Firefox defaults/pref
dir
/usr/bin/firefox
ไม่ใช่ไบนารี Firefox จริง ๆ ดังนั้นฉันใช้ผลลัพธ์ของreadlink
เพื่อค้นหาตำแหน่งที่ชี้ไปแล้วหาdefaluts/prefs
ไดเรกทอรีจากที่นั่น ในหมายเหตุด้านเกี่ยวกับ symlinking: การทำls -al /usr/bin/* |grep -- '->' |wc -l
แสดงให้เห็นถึง 303 ไบนารีในไดเรกทอรีนั้นการตั้งค่า Ubuntu ของฉันเป็น symlink จริง (ประมาณ 16% ของพวกเขา) ด้วยเหตุผลนี้รหัสด้านบนควรได้รับการแก้ไขในที่สุดเพื่อแก้ไข symlink ซ้ำจนกว่ามันจะพบเส้นทางที่เป็นที่ยอมรับไปยังไบนารี
type -P
คำถามฉันไม่คุ้นเคยกับคำสั่งนั้นเพื่อตอบคำถาม บางทีคุณสามารถทำอย่างละเอียดเล็กน้อย :)
type
เพราะมันเป็นพื้นฐานของคำตอบแรก (& ยอมรับ) มันคือเชลล์บิวด์อินที่ระบุว่าจะตีความชื่ออย่างไรหากใช้เป็นคำสั่ง รุ่น POSIX ของมันซึ่งค่อนข้างเปลือยกระดูก, อธิบายไว้ที่นี่ … (ต่อ)
หากโปรแกรมกำลังทำงานอยู่ให้โทร
ps -ef | grep PROGRAMM
เส้นทางของไบนารีถูกอ้างอิงใน$PATH
ตัวแปร
env
คุณสามารถดูเนื้อหาด้วย
$PATH
สามารถดูได้ด้วยenv
แต่echo $PATH
จะ verbose น้อย
คุณสามารถใช้คำสั่ง " นามแฝง " ในเทอร์มินัลเพื่อแสดงรายการนามแฝงทั้งหมดของคุณ หรือถ้าคุณอยู่ในไดเรกทอรีคุณสามารถใช้ " pwd " เพื่อแสดงเส้นทางปัจจุบันของคุณ
หากคุณรู้จักชื่อไฟล์หรือส่วนหนึ่งของชื่อไฟล์คุณสามารถใช้ " ค้นหา " เพื่อค้นหาไฟล์ของคุณ
find / -name things.jpeg
ใน MAC (OS X) คุณสามารถทำได้:
ตอนนี้คุณสามารถดูพา ธ แบบเต็มไปยังแอ็พพลิเคชันของคุณบนบรรทัดรับคำสั่งและรันจากที่นั่นหากคุณต้องการ
นำมาจากwikihow