280

I have a script that uses sh shell. I get an error in the line that uses the source command. It seems source is not included in my sh shell.

If I explicitly try to run source from shell I get:

sh: 1: source: not found

Should I somehow install "source"? Do I have a wrong version of sh?

Milad
  • 4,901
  • 5
  • 32
  • 43

14 Answers14

292

/bin/sh is usually some other shell trying to mimic The Shell. Many distributions use /bin/bash for sh, it supports source. On Ubuntu, though, /bin/dash is used which does not support source. Most shells use . instead of source. If you cannot edit the script, try to change the shell which runs it.

choroba
  • 231,213
  • 25
  • 204
  • 289
  • 7
    Thanks! Replacing /bin/sh with /bin/bash did work on Ubuntu! I'm curious why though, does it mean on Ubuntu bash is sh? – Milad Dec 04 '12 at 12:51
  • 3
    @Milad: On recent Ubuntus, `/bin/sh` calls `/bin/dash`. Traditionally, `/bin/sh` called `/bin/bash` is sh-compatibility mode. – choroba Dec 04 '12 at 13:03
  • @Milad I think it does not work on ubuntu 14.04. What is your OS version? – Reza Ameri Dec 29 '14 at 19:32
  • 1
    Maybe help known - if you have cascade scripts then rename all "sh -> bash". Thank you. :-) – Bruno May 12 '16 at 00:48
  • 4
    It wasn't immediately intuitive to me how to fix this issue unfortunately but it set me on the right path. I had to add `SHELL := /bin/bash` to the top of my Makefile. – fIwJlxSzApHEZIl Jun 11 '19 at 15:42
  • @fIwJlxSzApHEZIl I have been facing similiar issue as above question. My question is here: https://stackoverflow.com/questions/75036063/raspberry-pi-4-to-a-remote-mysql-stderr-bin-sh-1-mysql-not-found. You suggested adding something to the makefile? Does it mean to the `.js` script header? How I can include this `SHELL := /bin/bash` in the `.js` file header? Presently it is throwing error and I cannot include it. Thanks – Mainland Jan 06 '23 at 21:35
  • Hi, can you help me to solve a similar question of mine: https://stackoverflow.com/questions/75036063/raspberry-pi-4-to-a-remote-mysql-stderr-bin-sh-1-mysql-not-found – Mainland Jan 06 '23 at 22:10
228

In Bourne shell(sh), use the . command to source a file

. filename

In certain OS's/environments (Mac OS, Travis-CI, Ubuntu, at least) this must be:

. ./filename

(Credit to Adrien Joly's comment below)

Hawkeye Parker
  • 7,817
  • 7
  • 44
  • 47
Guru
  • 16,456
  • 2
  • 33
  • 46
69
$ls -l `which sh`
/bin/sh -> dash

$sudo dpkg-reconfigure dash #Select "no" when you're asked
[...]

$ls -l `which sh`
/bin/sh -> bash

Then it will be OK

gturri
  • 13,807
  • 9
  • 40
  • 57
shlsy
  • 707
  • 5
  • 2
  • Nice! I am running RHEL and Ubuntu servers and I always have small issues such as this one with Ubuntu. I really like RHEL and RHEL like linux. – radtek Mar 14 '14 at 19:05
  • The accepted answer doesn't work on Ubuntu 14, this one does! – rohithpr Oct 20 '15 at 08:50
  • Please add some further explanation to your answer - what does it do? `dpkg-reconfigure` might not be accessible for all users, especially on systems that are not based on Debian – Nico Haase May 15 '20 at 15:29
  • Fixed my `source: not found` errors with old telnet clients after debian upgrade, thanks. – bjoster May 16 '20 at 14:30
51

The source builtin is a bashism. Write this simply as . instead.

e.g.

. $FILE

# OR you may need to use a relative path (such as in an `npm` script):

. ./$FILE

https://wiki.ubuntu.com/DashAsBinSh#source

Travis Clarke
  • 5,951
  • 6
  • 29
  • 36
16

This problem happens because jenkins Execute Shell runs the script via its /bin/sh

Consequently, /bin/sh does not know "source"

You just need to add the below line at the top of your Execute Shell in jenkins

#!/bin/bash
Mojtaba Yousefi
  • 626
  • 1
  • 9
  • 27
13

I faced this error while i was trying to call source command from #Jenkins execute shell.

source profile.txt or source profile.properties

Replacement for source command is to use,

. ./profile.txt or . ./profile.properties

Note: There is a space between the two dots(.)

GangaRam Dewasi
  • 631
  • 7
  • 11
9

The source command is built into some shells. If you have a script, it should specify what shell to use on the first line, such as:

#!/bin/bash
mah
  • 39,056
  • 9
  • 76
  • 93
1

In case you cannot change the script to use "." instead of "source", change the link of "sh" to point to "bash" instead of "dash":

# which sh
/usr/bin/sh

# which bash
/usr/bin/bash

# ls -la /usr/bin/sh
lrwxrwxrwx 1 root root 4 Oct  5 15:55 /usr/bin/sh -> dash

# ln -sf /usr/bin/bash /usr/bin/sh

# ls -la /usr/bin/sh
lrwxrwxrwx 1 root root 4 Feb  6 09:18 /usr/bin/sh -> bash
MewX
  • 4,232
  • 1
  • 29
  • 38
0

I found in a gnu Makefile on Ubuntu, (where /bin/sh -> bash)

I needed to use the . command, as well as specify the target script with a ./ prefix (see example below)

source did not work in this instance, not sure why since it should be calling /bin/bash..

My SHELL environment variable is also set to /bin/bash

test:
    $(shell . ./my_script)

Note this sample does not include the tab character; had to format for stack exchange.

Gord Wait
  • 152
  • 1
  • 11
0

source is a bash built-in command so to execute source command, you can log in as Root.

sudo -s source ./filename.sh

swati jain
  • 25
  • 1
  • This does not look like a valid solution. What if the user does not have sudo permissions? And the sourced stuff is afterwards only available as admin user, which will cause new trouble – Nico Haase May 15 '20 at 15:27
0

On Ubuntu, instead of using sh scriptname.sh to run the file, I've used . scriptname.sh and it worked! The first line of my file contains: #!/bin/bash

use this command to run the script

.name_of_script.sh
DInfo2019
  • 11
  • 1
  • 2
    This has already been answered multiple times. Please provide more information if you add a new answer in such a case – Nico Haase May 15 '20 at 15:28
0

You have 2 options, switch from pure shell to bash which enables the bash features including source. https://superuser.com/questions/1220159/bash-prompt-variables-not-working/1764353#1764353

Or use . instead of source with this form

. ~/.your_file_name

for example

. ~/.bashrc

please consider one space between Dot and Tilda. Tilda refers to the home directory, if your file is located somewhere above the home, use an absolute address from /

-3

This may help you, I was getting this error because I was trying to reload my .profile with the command . .profile and it had a syntax error

Kellen Stuart
  • 7,775
  • 7
  • 59
  • 82
-10

Bourne shell (sh) uses PATH to locate in source <file>. If the file you are trying to source is not in your path, you get the error 'file not found'.

Try:

source ./<filename>
mosu
  • 7
  • 1