Running scripts from another directory
sh /path/to/script will spawn a new shell and run she script independent of your current shell. The source
(.) command will call all the commands in the script in the current shell. If the script happens to call exit
for example, then you'll lose the current shell. Because of this it is usually safer to call scripts in a separate shell with sh or to execute them as binaries using either the full (starting with /
) or relative path (./
). If called as binaries, they will be executed with the specified interpreter (#!/bin/bash
, for example).
As for knowing whether or not a script will find the files it needs, there is no good answer, other than looking at the script to see what it does. As an option, you could always go to the script's folder in a sub-process without leaving your current folder:
(cd /wherever/ ; sh script.sh)
You can definitely do that (with the adjustments the others mentioned like sudo sh /pathto/script.sh
or ./script.sh
). However, I do one of a few things to run them system wide to not worry about dirs and save me useless extra typing.
1) Symlink to /usr/bin
ln -s /home/username/Scripts/name.sh /usr/bin/name
(be sure there is no overlapping name there, because you would obviously override it.) This also lets me keep them in my development folders so I can adjust as necessary.
2) Add the Scripts dir to your path (using .bash_profile - or whatever.profile you have on your shell)
PATH=/path/to/scripts/:$PATH
3) Create Alias's in the .bash_profile
in ~/.bash_profile
add something like:
alias l="ls -l"
As you can tell, the syntax is just alias, digits you want to act as a command, the command. So typing "l" anywhere in the terminal would result in ls -l
If you want sudo, just alias sl="sudo ls -l"
to note to yourself l vs sl (as a useless example).
Either way, you can just type sudo nameofscript
and be on your way. No need to mess with ./ or . or sh, etc. Just mark them as executable first :D
I usually do like you say
sh /path/to/script
And to run it as root/superuser
sudo sh /path/to/script
Your current directory only matters if the scripts assumes you are in the same folder as it. I would assume most scripts don't do this and you are save to run it like above.