仅当Bash脚本运行到“sudo”时才提示“sudo”;“拒绝许可”;

仅当Bash脚本运行到“sudo”时才提示“sudo”;“拒绝许可”;,bash,shell,file-permissions,Bash,Shell,File Permissions,假设我有一个非常简单的脚本,它在某个目录中创建了一个链接,如果失败,就会终止该脚本 ln -s "/opt/myapp" "${1}/link" || exit 1; 现在,如果遇到错误,它就会退出。我想将其更改为只有在创建链接时遇到权限错误时,它才会执行以下行而不是退出: echo "The target directory requires root privileges to access." sudo ln -s "/opt/myapp" "${1}/myapp" || exit 1;

假设我有一个非常简单的脚本,它在某个目录中创建了一个链接,如果失败,就会终止该脚本

ln -s "/opt/myapp" "${1}/link" || exit 1;
现在,如果遇到错误,它就会退出。我想将其更改为只有在创建链接时遇到权限错误时,它才会执行以下行而不是退出:

echo "The target directory requires root privileges to access."
sudo ln -s "/opt/myapp" "${1}/myapp" || exit 1;
我不想提示用户以root用户身份运行,除非他们必须这样做


ln
似乎会在失败时重新运行退出代码1,无论它是权限问题还是任何其他错误,例如目录不存在,因此我无法使用它来检测它遇到的问题


如果我通过
ln
的输出存储搜索字符串“Permission denied”,我假设它将在非英语操作系统上失败。

我不知道如何对
ln
退出原因进行分类,或者至少不知道关于可以使用
$?
测试的特定退出代码的任何文档,但您可以使用以下标准测试相关权限:


我不知道有什么方法可以对退出原因进行分类,或者至少有任何关于特定退出代码的文档可以使用
$?
进行测试,但是您可以使用标准测试相关权限:

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