.local-bin/scripts/get_app_id.sh
2026-02-09 13:52:33 -05:00

81 lines
1.8 KiB
Bash
Executable file

#!/usr/bin/env bash
set -euo pipefail
# Extract code-signing identifier from macOS application bundles
# Usage: get_app_id [app_name|app_path]
extract_identifier() {
local app="$1"
codesign -dr - "$app" 2>&1 | grep -m1 "identifier" | sed -E 's/.*identifier "([^"]+)".*/\1/'
}
validate_and_extract() {
local app_path="$1"
if [[ ! -d "$app_path" ]]; then
echo "Error: Application not found: $app_path" >&2
return 1
fi
# Extract identifier
local identifier
identifier=$(extract_identifier "$app_path")
if [[ -z "$identifier" ]]; then
echo "Error: No code signature found for: $(basename "$app_path")" >&2
return 1
fi
echo "$identifier"
}
get_app_id() {
local app_path="${1:-}"
# If no argument, use fzf to select
if [[ -z "$app_path" ]]; then
if ! command -v fzf &>/dev/null; then
echo "Error: fzf is required for interactive selection" >&2
echo "Install with: brew install fzf" >&2
return 1
fi
# shellcheck disable=SC2016
app_path=$(
find /Applications -maxdepth 3 -name "*.app" -type d |
sort |
fzf --prompt="Select app: " \
--preview='
app={}
printf "Application: %s\n\n" "$(basename "$app")"
id=$(codesign -dr - "$app" 2>&1 | grep -m1 "identifier" | sed -E "s/.*identifier \"([^\"]+)\".*/\1/")
if [[ -n "$id" ]]; then
printf "Bundle ID:\n%s\n" "$id"
else
printf "No code signature found\n"
fi
' \
--preview-window="up:5:wrap" \
--height="50%"
)
extract_identifier "$app_path"
return 0
fi
# Resolve app path
if [[ "$app_path" != /* ]]; then
if [[ "$app_path" == *.app ]]; then
app_path="/Applications/$app_path"
else
app_path="/Applications/$app_path.app"
fi
fi
validate_and_extract "$app_path"
}
# Main execution
if [[ "${BASH_SOURCE[0]}" == "${0}" ]]; then
get_app_id "$@"
fi