Thật không may, không có cách nào được cung cấp để gọi một ứng dụng theo dòng lệnh bằng tên của nó. Cung cấp tính năng này có nghĩa là phân tích thêm không đáng tin cậy cho các ứng dụng đã cài đặt và một số người sẽ coi đó là một lỗ hổng bảo mật. Tuy nhiên, bạn có thể tự phân tích cú pháp bằng một tập lệnh tìm kiếm và trích xuất tên của từng tiện ích mở rộng / ứng dụng cho đến khi tìm thấy tên bạn tìm kiếm:
/usr/local/bin/chrome-app-by-name:
#!/bin/zsh
emulate -R zsh -o extendedglob -o nullglob
setopt rematchpcre ;# recommended, I'm so used to PCRE, I sometimes forget what doesn't work in Regex
Chrome_Profile=Default ;# or "Profile 1" ...
cd ${XDG_CONFIG_HOME:-$HOME/.config}/google-chrome/${Chrome_Profile}/Extensions
foreach app in */*
# We have just called the path to each version of each extension/app.
# Next we enclose in braces - slightly unnecessary - to ensure that
# whatever version of Zsh, "manifest.json" is completely read and
# closed before we use the variable.
{
App_Manifest="$(cat <$app/manifest.json)"
}
if [[ $App_Manifest =~ '^\s*"name"\s*:\s*"([a-zA-Z 0-9_.-]+)"' ]]
then
app_name="$match[1]" ;# capture the sub-expression match for "name"
if [[ $app_name == $1 ]]
then
# For my system this is actually exec google-chrome-stable ...
exec google-chrome --app-id="${app%%/*}" $argv[2,-1]
fi
fi
end
echo "App name not found. Please use Exact, case-sensitive spelling."
Một số ứng dụng đặt tên của họ sâu hơn trong các tập lệnh - Tôi không biết tại sao! Bạn có thể phải viết lại hoặc thêm vào tập lệnh như tập lệnh này để tìm kiếm các tệp ".desktop" trong ~/.local/share/applications
'^ NAME = ...' tương đương với ở trên, sau đó nhận lệnh thực thi ở đó.
Tôi chưa thử kịch bản này - Tôi chỉ viết nó ngay lập tức để trả lời câu hỏi của bạn. Tôi hy vọng rằng đây là một ví dụ phù hợp với bạn, nhưng nếu ý tưởng đó không hoàn toàn đúng, chúng tôi có thể điều chỉnh nó một chút. Zsh là cú pháp đơn giản, chuyển tiếp so với một số shell tương thích sh khác. Tôi đã cố gắng loại bỏ bất kỳ tính năng nào yêu cầu các phiên bản hoặc mô-đun mới ngoại trừ PCRE. PCRE dễ sử dụng hơn rất nhiều cho việc khớp mẫu chính xác mà tôi thường cần đến nỗi tôi bỏ bê Regex thường xuyên. Một tập lệnh Perl dài hơn có thể hoạt động, hầu hết cú pháp này sẽ chạy không được sửa đổi trong /bin/bash
. foreach ... end
, $match[1]
mảng kiểu, setopt rematchpcre
systax chính xác của Bash Regex, và emulate
là những ngoại lệ chính.
.desktop
tệp tương ứng trong~/.local/share/applications
(kéo nó qua cửa sổ gedit đã mở), bạn có thể thấy lệnh chính xác trongExec=
dòng.