57

I've been working on a script that automates setting up a development environment for Raspberry Pi development (step by step details that work are here). The script is linked in that article but convenience you can find it here also. Now when run this script install and sets up the environment without error but you have to enter your sudo password more than once due to sudo's time-out value by default. So I started experimenting by removing all the sudo lines and running the whole script via sudo at the command line like so:

kemra102@ubuntuvm:~$ sudo ./pi_dev_env_install.sh

This works fine as expected and gets most of the way through until this point:

./pi_dev_env_install: 68: ./pi_dev_env_install.sh: Syntax error: "(" unexpected

Now this line worked fine previously when not running the whole script with sudo. There is nothing about this line running as sudo that should stop it working to my knowledge, does anyone have any ideas?

  • 1
    The shebang is really in line 9? Due to Ubuntu's DashAsBinSh affinity I suspect your script is interpreted by dash instead of bash. Try to move the shebang in line 1. – manatwork Aug 18 '12 at 11:45
  • According to that article calling /bin/bash directly instead of /bin/sh will; correctly use bash instead of dash so that should not be an issue as I understand it. I can still move the shebang of course, but that doesn't really explain as to why it works when you don’t sudo the whole script. – kemra102 Aug 18 '12 at 11:50
  • In my case everything was fine but as a habit, I was running my shell script with "sh" not with "bash". – Indrajeet Gour Oct 11 '18 at 8:53
77

The script does not begin with a shebang line, so the system executes it with /bin/sh. On Ubuntu, /bin/sh is dash, a shell designed for fast startup and execution with only standard features. When dash reaches line 68, it sees a syntax error: that parenthesis doesn't mean anything to it in context.

Since dash (like all other shells) is an interpreter, it won't complain until the execution reaches the problematic line. So even if the script successfully started at some point in your testing, it would have aborted once line 68 was reached.

The shebang line must be the very first thing in the file. Since you use bash features, the first line of the file must be #!/bin/bash or #!/usr/bin/env bash.

  • 2
    Thanks clearly a gap in my knowledge, I don't script much so wasn't aware of that! Thanks for the explanation it's helped a lot and will be very useful to know in the future too. – kemra102 Aug 18 '12 at 12:25
  • Let me add that this error occurs even while using scripts extension for nautilus. Adding the shebang line solved it immediately. +1. – Bhavin Doshi Oct 9 '13 at 5:14
  • Facing the issue running sonarqube.sh on Ubuntu 15.10. Changed the header as said. Executing sudo sh ./sonar.sh console. Still getting the error. – soufrk Sep 1 '16 at 6:58
  • @soufrk Is it sonarqube.sh or sonar.sh? Make up your mind. And anyway, if you can't solve the problem with the information in this thread, ask a new question with the full content of the script and copy-paste the full error message(s). – Gilles Sep 1 '16 at 7:06
  • My bad !! Was running wrong arch executable. But interestingly, on the correct arch the file beginning with #! /bin/sh executed perfectly. Now, that leaves me puzzled. – soufrk Sep 1 '16 at 7:07
5

If the shebang is not on the first line, it will not be respected, regardless of the shell of the root user, the SHELL variable or the -s flag. You can easily confirm this is with a simple example:

#
#!/bin/bash
offfset=(`ls`)
echo $offset

Running this script with sudo will raise a syntax error in recent versions of Ubuntu and Debian.

You have two options to make sure the script is interpreted by bash:

  1. Move the shebang to the first line

  2. Run sudo like this:

    sudo bash ./pi_dev_env_install.sh
    
1

For me starting script with:

bash ./< script file > 

works fine.

  • That may well be true for you, but it isn't really a solution to the stated problem. – bu5hman Dec 24 '17 at 15:41
0

Maybe you have a "(" on the dir or file name.

  • 2
    The missing shebang was already accepted as the answer by the original poster. – Philipp Claßen Jan 22 '13 at 22:58
0

Try dos2unix in script file. Sometimes some hidden characters are there in the source.

command:

dos2unix script_file.sh script_file.sh
-1
sudo chmod 755 <script>

In my case the error was lack of permissions to execute the file. Only got the error message when I separated the commands:

$ sudo sh
# ./install
  • Lack of permissions would not cause this error message. – Gilles Nov 27 '15 at 22:43

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.