Extraño error de sintaxis de bash según el uso de sudo

Extraño error de sintaxis de bash según el uso de sudo

Hice esta función bash para detectar si el usuario que ejecuta realmente inició sesión como usuario root y no usa sudo verificando el directorio de inicio uid + del usuario que ejecuta el comando:

#!/bin/bash

set -x
function check_root(){
  home=`sh -c 'cd ~/ && pwd'`
  if [ "$home" != "/root" ] || [ "$(id -u)" != "0" ]; then
    echo -e "This script can only be executed by the root user, not with sudo  elevation"
  exit 1
  fi
}

check_root

Cuando lo ejecuto como usuario normal (uid 1000), funciona como se esperaba:

++ check_root
+++ sh -c 'cd ~/ && pwd'
++ home=/home/jake
++ '[' /home/jake '!=' /root ']'
++ echo -e 'This script can only be executed by the root user, not with sudo    elevation'
This script can only be executed by the root user, not with sudo elevation
++ exit 1

Cuando lo ejecuto como root también funciona como se esperaba:

++ check_root
+++ sh -c 'cd ~/ && pwd'
++ home=/root
++ '[' /root '!=' /root ']'
+++ id -u
++ '[' 0 '!=' 0 ']'

Pero cuando lo ejecuto como usuario normal (uid 1000) con sudo elevación me sale esto:

./check_root.sh: 4: ./check_root.sh: Syntax error: "(" unexpected

Información del sistema:

Linux jake 3.11.0-26-generic #45~precise1-Ubuntu SMP martes 15 de julio 04:02:35 UTC 2014 x86_64 x86_64 x86_64 GNU/Linux

bash --versión GNU bash, versión 4.2.25(1)-lanzamiento (x86_64-pc-linux-gnu)

Respuesta1

Mientras tanto, resolví esto, pero aún no publiqué la solución; resultó estar relacionada con la sintaxis:

Soluciones de trabajo:

function check_root {
 stuff..
}

y

function check_root () {
 stuff..
}

Por ejemplo, eliminar () de la declaración de función o asegurarse de que esté separado por espacios en ambos lados soluciona el problema.

Esto es lo que encontré en la página de manual de bash que me hizo detectar el error:

Shell Function Definitions
       A shell function is an object that is called like a simple command and executes a compound command with a new set of positional parameters.  Shell functions are declared as follows:

       name () compound-command [redirection]
       function name [()] compound-command [redirection]
              This defines a function named name.  The reserved word function is optional.  If the function reserved word is supplied, the parentheses are optional

Pero... no tengo idea de qué es exactamente lo que hace que bash se comporte de esta manera en este caso.

información relacionada