I am currently trying to write a function for my bash profile which causes an OSX LaunchAgent passed as argument to restart. It might be a bit pointless but for one I want to stop having to write long paths for launchctl un/load
I have got almost everything working, except for the the final calls to launchctl. Here's the function script and the consequent error messages:
function
launchctl_mgr() {
failure() {
local lineno=$1
local msg=$2
echo "Failed at $lineno: $msg"
}
trap 'failure ${lineno} "$BASH_COMMAND"' ERR
trap 'trap - ERR' RETURN
instruction=$1
filepath=$2;
#test whether the file argument is already a file or not and whether or not it is actually$
if [[ ! -f $2 ]]
then
if [[ -f ~/Library/LaunchAgents/$2.plist ]]
then
filepath="~/Library/Launchagents/$filepath.plist"
echo "found!: $filepath"
elif [[ -f /Library/LaunchAgents/$2.plist ]]
then
filepath="/Library/LaunchAgents/$filepath.plist"
else
echo "debug: ~/Library/LaunchAgents/$filepath.plist"
echo "Filename supplied was not valid as a launchagent"
return 1
fi
fi
if [[ $instruction=="restart" || instruction=="unload" ]]
then
echo "instruction is $instruction"
echo "filepath is $filepath"
launchctl stop $filepath
launchctl unload $filepath
if [[ instruction=="restart" ]]
then
launchctl load $filepath
launchctl start $filepath
fi
fi
}
Output/errors
____________________ => launchctl_mgr unload local.unminimise
found!: ~/Library/Launchagents/local.unminimise.plist
instruction is unload
filepath is ~/Library/Launchagents/local.unminimise.plist
Failed at launchctl stop $filepath:
/Users/[current_user]/~/Library/Launchagents/local.unminimise.plist: No such file or directory
/Users/[current_user]/~/Library/Launchagents/local.unminimise.plist: No such file or directory
Failed at launchctl start $filepath:
('[current_user]' replaces my actual user account name)
As you can see for launchctl, whether it is bash or launchctl the current directory path and the path string I had fed launchctl are concatenated together, causing an error. The filepath string is printed and looks ok in the line directly before
==
in your[[ ... ]]
tests (otherwise they're just evaluated as strings, and non-empty is true. The string$instruction=="restart"
is non-empty and will always evaluate as true.$instruction == "restart"
is an equivalence test and will evaluate to either true or false depending on the value in$instruction
). You've also missed the$
beforeinstruction ==
in a few places. – cas Sep 08 '19 at 00:13