IQAndreas
IQAndreas

Reputation: 8468

Prompt for `sudo` only if Bash script runs into "Permission denied"

Let's say I have a very simple script which creates a link in a certain directory, and kills the script if it fails.

ln -s "/opt/myapp" "${1}/link" || exit 1;

Right now it just quits if it runs into errors. I want to change it so only if it runs into permission errors when creating the link, it will execute the following lines instead of exiting:

echo "The target directory requires root privileges to access."
sudo ln -s "/opt/myapp" "${1}/myapp" || exit 1;

I don't want to prompt the users to run as root unless they absolutely have to.


ln seems to retun exit code 1 on failure regardless of whether it was a problem with permissions or any other errors such as a directory not existing, so I can't use that to detect which problem it ran into.

And if I instead store search through the output of ln for the string "Permission denied", I'm assuming it will fail on non-english operating systems.

Upvotes: 2

Views: 1142

Answers (1)

Jeff Bowman
Jeff Bowman

Reputation: 95634

I don't know of any ways to categorize ln exit reasons, or at least any documentation about specific exit codes you could test with $?, but you can test for relevant permissions with the standard test or [ command:

SOURCEFILE="/opt/myapp"
DESTDIR="${1}"
DESTTARGET="${DESTDIR}/myapp"

if [ ! -d "$DESTDIR" -o ! -e "$SOURCEFILE" ]; then
  echo "Source file does not exist or destination directory does not exist." >&2
elif [ ! -r "$SOURCEFILE" -o ! -w "$DESTDIR" ]; then
  echo "Source file is not readable or destination directory is not writable." >&2
  # Run sudo command here
else
  # Should work, run command here
fi

Upvotes: 1

Related Questions