Take the 2-minute tour ×
Unix & Linux Stack Exchange is a question and answer site for users of Linux, FreeBSD and other Un*x-like operating systems.. It's 100% free, no registration required.

I must be missing a fundamental understanding about sourcing files in bash. I've tried the different approaches that seem like they should work, but I still get this error source: not found.

In my script I tried to cd to the directory where the file that I want to source is located before sourcing it. That didn't work.

cd /home/user/path/to/
source myfile

Neither did providing the full absolute path to the file to be sourced:

source /home/user/path/to/myfile

The error is "source: not found" with the line number of the above statement.

Is there something else, something basic, I could be overlooking? I have checked the paths I'm using and I don't see any errors. This problem is repeatable.

I'm running Ubuntu on a Linode server and my scripts all start with:

#!/bin/bash
share|improve this question
    
Is the error from 'source" or from 'myfile'? Try: 'set -v -x; source /home/user/path/to/myfile; set +v +x How about: alias source ; echo $SHELL ; echo $POSIXLY_CORRECT –  D McKeon Feb 23 at 19:13
    
I believe my script, when run on the server, is being called like this: sh myscript so even though my script starts with #!/bin/bash and echo $SHELL returns /bin/bash, source is somehow still not working. –  MountainX Feb 23 at 20:37
add comment

2 Answers

up vote 3 down vote accepted

Your second attempt using the absolute path should be the correct method.

Possible causes of your bug:

  1. The file doesn't exist.
  2. The file exists, but for some reason you can't read it (eg permissions or some filesystem error.
  3. You have an alias which is overriding the builtin source (fix with unalias source)
  4. You have a function which is overriding source (fix with unset -f source)
  5. You are somehow not using bash (although your bang line would suggest you are). source is not POSIX. Using source on dash does not work, only . works.
  6. My test with source with bash in POSIX mode worked, though maybe this is due to my version or compilation flags. Maybe this is different for you and you are in POSIX mode.

1 and 5 give errors like the one you posted.

share|improve this answer
    
Yes! Thank you. I believe my script, when run on the server, is being called like this: sh myscript so even though my script starts with #!/bin/bash that is somehow not enough. So... how do I source a file in this case? Thanks –  MountainX Feb 23 at 20:35
    
I checked further. It is somehow using dash (seemingly b/c it is called with sh myscript on Ubuntu). Using the dash dot notation (.) to source works. But is there a way to force my script to run in bash? Bash is available. –  MountainX Feb 23 at 20:49
1  
@MountainX, the bang line isn't read by the interpreter, it is read by the kernel when you try to execute the file. –  Graeme Feb 23 at 20:50
1  
You have to use bash to run the script or set executable permissions and execute directly. –  Graeme Feb 23 at 20:51
    
@MountainX You could symlink sh to bash, but this would likely mess up your system in other ways. Plus you would then be running in POSIX mode and not have all the bash features. –  Graeme Feb 23 at 20:53
show 2 more comments

You are probably logging in with a user that runs a shell other than bash. Suppose you log in with user X and X runs sh or another shell, not bash, and with user X you run source myscript.sh, then you should get the given error.

share|improve this answer
    
Thank you. I believe my script, when run on the server, is being called like this: sh myscript so even though my script starts with #!/bin/bash that is somehow not enough. So... how do I source a file in this case? Thanks –  MountainX Feb 23 at 20:36
    
step 1: chmod +x myscript.sh step 2: path/myscript.sh –  Mohsen Pahlevanzadeh Feb 23 at 20:39
    
@MountainX If you have no control over what is running your script, you can use the standard name . instead of the bash synonym source. –  Gilles Feb 23 at 23:50
    
@Gilles - that worked. I used .. I didn't know it was the "standard" name and that source was just a synonym for it. –  MountainX Feb 24 at 1:20
    
source actually came from the cshell, and the bourne shell originally used . –  X Tian Feb 25 at 22:16
add comment

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

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