Відповіді:
Ви можете використовувати 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
.
/usr/bin/firefox
насправді не є бінарним файлом Firefox, тому я використовую вихідний файл, readlink
щоб знайти місце, де він вказує, а потім знайти defaluts/prefs
каталог звідти. З іншого боку, про ls -al /usr/bin/* |grep -- '->' |wc -l
символічне посилання: Doing ілюструє близько 303 бінарних файлів у цьому каталозі, моя конфігурація Ubuntu насправді є посиланнями. (приблизно 16% з них). З цієї причини, вищезгаданий код ** слід * врешті-решт модифікувати, щоб вирішувати символьні посилання рекурсивно, поки не знайде канонічний шлях до двійкового.
type -P
запитання, я недостатньо знайомий з цією командою, щоб відповісти на питання. Можливо, ви можете трохи допрацювати. :)
type
тому що вона була основою першої (і прийнятої) відповіді. Це вбудована оболонка, яка вказує, як інтерпретуються вказані імена, якщо вони використовуються як команди. Версія POSIX з нього, що є досить скелетних, описана тут . … (Продовжував)
Шлях бінарних файлів посилається на $PATH
змінну.
Ви можете бачити його вміст за допомогою env
.
$PATH
можна переглядати env
, але echo $PATH
буде менш багатослівним.
Ви можете використовувати команду " псевдонім " у терміналі, щоб перелічити всі псевдоніми. Або якщо ви знаходитесь в каталозі, ви можете використовувати " pwd ", щоб показати свій поточний шлях.
Якщо ви знаєте ім'я файлу або частину імені файлу, тоді ви можете використовувати " знайти ", щоб знайти свій файл.
find / -name things.jpeg
На MAC (OS X) ви можете:
Тепер ви можете побачити повний шлях до вашої програми в командному рядку і запустити її звідти, якщо хочете.
Взяті з wikihow