이상한 bash 구문 오류는 sudo 사용법에 따라 다릅니다.

이상한 bash 구문 오류는 sudo 사용법에 따라 다릅니다.

명령을 실행하는 사용자의 uid + 홈 디렉터리를 확인하여 명령을 실행하는 사용자가 실제로 sudo를 사용하는 대신 루트로 로그인했는지 감지하기 위해 이 bash 함수를 만들었습니다.

#!/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

일반 사용자(uid 1000)로 실행하면 예상대로 작동합니다.

++ 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

루트로 실행하면 예상대로 작동합니다.

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

그러나 일반 사용자(uid 1000)로 sudo 권한 상승을 사용하여 실행하면 다음과 같은 결과가 나타납니다.

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

시스템 메시지:

Linux jake 3.11.0-26-generic #45~precise1-Ubuntu SMP 화요일 7월 15일 04:02:35 UTC 2014 x86_64 x86_64 x86_64 GNU/Linux

bash --version GNU bash, 버전 4.2.25(1)-release (x86_64-pc-linux-gnu)

답변1

그동안 이 문제를 해결했지만 아직 해결 방법을 게시하지 않았습니다. 결과는 구문과 관련되어 있습니다.

작업 솔루션:

function check_root {
 stuff..
}

그리고

function check_root () {
 stuff..
}

예를 들어 함수 선언에서 ()를 제거하거나 양쪽을 공백으로 구분하면 문제가 해결됩니다.

이것이 오류를 발생시킨 bash 맨페이지에서 찾은 내용입니다.

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

하지만 ..이 경우 bash가 정확히 어떻게 작동하는지 모르겠습니다.

관련 정보