6

I want to activate a virtual env in shell script, so I write a simple script as follow:

#!/bin/bash

source ~/env/lib/bin/activate
#nohup python mock_run.py
#echo $! > save_pid.txt

I start the script with sh start.sh, but I got error as follow:

start.sh: 3: start.sh: source: not found

I run source ~/env/lib/bin/activate is ok, so why can not in shell script?

roger
  • 9,063
  • 20
  • 72
  • 119
  • Make sure you're running it with bash via #!/bin/bash in the top and ``sh start.sh``. Also source has an alias ``.`` so try ``. ~/env/lib/bin/activate`` – Marc Young Sep 21 '15 at 02:34
  • I have `#!/bin/bash` in my script, and `. ~/env/lib/bin/activate` is ok, but why `source` is not ok? – roger Sep 21 '15 at 02:37
  • Rather, *don't* use `sh start.sh`. Run the script with `./start.sh`. Don't explicitly invoke the shell. – John Kugelman Sep 21 '15 at 02:43

1 Answers1

15

Note that the shebang line:

#!/bin/bash

is not in effect when you invoke the script with

sh script.sh

The shebang is in effect only if you call the script directly, like a binary.


You need to either:

chmod +x script.sh
./script.sh

to make the shebang line working, or call it explicitly with bash:

bash script.sh
hek2mgl
  • 152,036
  • 28
  • 249
  • 266