奇妙なbash構文エラーはsudoの使い方によって異なります。

奇妙なbash構文エラーはsudoの使い方によって異なります。

コマンドを実行しているユーザーのuid +ホームディレクトリを調べて、コマンドを実行しているユーザーが実際にsudoを使用する代わりにrootとしてログインしていることを検出するために、この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が正確にどのように機能するのかわかりません。

おすすめ記事