Câu trả lời:
Bạn có thể sử dụng type
và which
để xác định một lệnh nào đó bash
là gì, và, nếu đó là một ứng dụng, nơi nó nằm.
$ 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
Các lệnh which
và type -P
chỉ hoạt động cho các chương trình trên của bạn PATH
, tất nhiên, nhưng bạn sẽ không thể chạy người khác bằng cách chỉ cần gõ tên lệnh của họ.
Nếu bạn đang tìm kiếm một cách đơn giản để xác định nơi gói ứng dụng OS X (GUI) được cài đặt (như được sử dụng, ví dụ như open
lệnh), bạn có thể thực thi AppleScript ngắn sau đây từ dòng lệnh:
$ osascript -e 'tell application "System Events" to POSIX path of (file of process "Safari" as alias)'
/Applications/Safari.app
Điều này đòi hỏi chương trình đang được đề cập (ví dụ về Safari) đang chạy.
Đây là phương pháp tôi hiện đang định vị thư mục ứng dụng Firefox trong OSX và Linux. Nên dễ dàng chấp nhận cho một ứng dụng khác. Đã thử nghiệm trên 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
và type -P
không? Mã không phải OSX có hoạt động trên OS X không? Nếu không, bạn có thể giải thích tại sao không? Nếu có, tại sao bạn có hai phiên bản?
/bin
hoặc /usr/bin
, v.v. mà thay vào đó được cài đặt /Applications/My3rdPartyApp.app
và nhị phân được lưu trữ trong thư mục con Contents/MacOS
làm cho nó hoàn toàn khó sử dụng bất kỳ kỹ thuật đa nền tảng nào để xác định vị trí của ứng dụng (do đó sử dụng lsregister
) Tệ hơn nữa, cấu trúc thư mục OSX đặt nhị phân ở một vị trí riêng biệt với các tài nguyên. Đoạn trích trên được viết để hỗ trợ xác định vị trí defaults/pref
thư mục của Firefox .
/usr/bin/firefox
thực tế không phải là nhị phân Firefox, vì vậy tôi sử dụng đầu ra của readlink
để xác định vị trí của nó, và sau đó tìm defaluts/prefs
thư mục từ đó. Bên cạnh đó, về liên kết tượng trưng: Thực hiện ls -al /usr/bin/* |grep -- '->' |wc -l
minh họa khoảng 303 nhị phân trong thư mục đó cấu hình Ubuntu của tôi thực sự là các liên kết tượng trưng. (khoảng 16% trong số họ) Vì lý do này, đoạn mã trên ** cuối cùng * nên được sửa đổi để giải quyết đệ quy liên kết cho đến khi tìm thấy đường dẫn chính tắc đến nhị phân.
type -P
câu hỏi, tôi không đủ quen thuộc với lệnh đó để trả lời câu hỏi. Có lẽ bạn có thể xây dựng một chút. :)
type
vì đó là cơ sở của câu trả lời đầu tiên (& được chấp nhận). Nó là một phần tử dựng sẵn cho biết cách các tên được chỉ định sẽ được hiểu nếu được sử dụng như các lệnh. Phiên bản POSIX của nó, khá đơn giản, được mô tả ở đây . Tiết (Cont'd)
Nếu chương trình đang chạy, hãy gọi
ps -ef | grep PROGRAMM
Đường dẫn của nhị phân được tham chiếu trong $PATH
biến.
Bạn có thể xem nội dung của nó với env
.
$PATH
có thể được xem với env
, nhưng echo $PATH
sẽ ít dài dòng hơn.
Bạn có thể sử dụng lệnh " bí danh " trong thiết bị đầu cuối để liệt kê tất cả các bí danh của bạn. Hoặc nếu bạn đang ở trong một thư mục, bạn có thể sử dụng " pwd " để hiển thị đường dẫn hiện tại của mình.
Nếu bạn biết tên tệp hoặc một phần của tên tệp, thì bạn có thể sử dụng " tìm " để định vị tệp của mình.
find / -name things.jpeg
Trên MAC (OS X), bạn có thể làm:
Bây giờ bạn có thể thấy đường dẫn đầy đủ đến ứng dụng của bạn trên dòng lệnh và chạy nó từ đó nếu bạn muốn.
Lấy từ wikihow