4

Not sure what is happening.

Lets call script a.sh with the following

/users/guru$ cat a.sh
#! /usr/bin/ksh

echo "Hello"
date

Execute with ksh. It gets done.

/users/guru$ ksh a.sh
Hello
Tue Jul 15 15:00:52 EDT 2014

Ensure file permission and ksh path.

/users/guru$ ls -l a.sh
-rwxrwxrwx    1 guru  kpc         35 Jul 15 15:00 a.sh
/users/guru$ a.sh
ksh: a.sh:  not found
/users/guru$ which ksh
/usr/bin/ksh
Guru
  • 181
  • 1
  • 1
  • 6
  • Sometimes it is possible to have whitespaces which might cause the error. See the answer to this question here. http://unix.stackexchange.com/questions/134581/ksh-revenue-ext-ksh-not-found-no-such-file-or-directory – Ramesh Jul 15 '14 at 19:22
  • The following command fixed it: add ``export PATH=$PATH:.`` to users ``.profile`` – Guru Jul 15 '14 at 22:09
  • 1
    See my other comment about why `PATH=$PATH:.` is considered harmful. – ctrl-alt-delor Jul 15 '14 at 22:12
  • Thanks, Richard. It helps. However, I would ask for more reasons/detials, I do not agree a mere filename-command-conflict warrant banning inclusion of "." to PATH altogether. Simply, I would never name my scripts as a keyword (or ensure "." is at the end of path). – Guru Jul 15 '14 at 22:40

3 Answers3

8

Try "./a.sh" when trying to execute it. It needs to know where the file is at.

The './' tells it to look in the current directory.

Tango Bravo
  • 355
  • 2
  • 10
  • +1 OK. ``./`` does the trick. But why so? I should be able to execute the script as such calling the file? – Guru Jul 15 '14 at 19:20
  • 1
    Shell environments have an environment variable called "PATH" (echo $PATH), if the script you are executing is not within the $PATH, then it won't know where to look. If you want to make it executable from anywhere try putting it in a directory in the path, or add a directory to it, where you keep your scripts. – Tango Bravo Jul 15 '14 at 19:22
  • 3
    It used to be common practice to have `.` in the `PATH`, but then it was realised that it was a security risk, so it was removed. Imagine . being at start of `PATH`. Then a local script called `ls` could intercept calls to `ls`. If `.` is but at the end of `PATH`, then you install package that has a program with conflicting name the this program is run instead of the one you expect. (You may notice that in `cmd` on ms-windows `.` is implicitly in the `PATH`, this could be considered a bug in `cmd`, as it can not be changed. You may also note that ms-windows has more virus problems. – ctrl-alt-delor Jul 15 '14 at 22:11
4

When you type a command, the shell looks up the command from a list of directories, as specified by the PATH variable.

The current directory is not in PATH by default (for security reason), so the shell can not find your script.

Using ./, meaning the current directory, so the shell knows where is your script.

cuonglm
  • 150,973
  • 38
  • 327
  • 406
  • So, add "." to path and export path? I can use ./ but want to know why can't we run the script as such. – Guru Jul 15 '14 at 19:39
  • Yes, add `PATH=$PATH:.` in your `.bashrc`, and remember to do it for **TESTING** only. – cuonglm Jul 15 '14 at 19:42
  • @Guru You cant run it as such because the directory the script is located in is not in the PATH. Executing `a.sh` will only work if it can be found in your PATH. – casey Jul 16 '14 at 00:37
1

As I have posted in the other question, sometimes it is possible to get the file not found error even when you execute the script as ./scriptname. As I have posted in the other answer, you can test it in your machine.

Testing

cat ksh_experiment.ksh

#!/usr/bin/ksh
echo "Hello"

Now after providing the permissions when I ran the file, it produced the output successfully. Now as discussed over here, I inserted some carriage returns in my file. Now when I ran the script, I was getting the output as,

ksh: ./ksh_experiment.ksh: not found [No such file or directory]

Now, cat -v ksh_experiment.ksh too produced the same output. Also, if I typed vim ksh_experiment.ksh , a new file was getting opened.

As discussed in the answer of the link that I provided, I removed the carriage returns using the command,

 perl -p -i -e "s/\r//g" ksh_experiment.ksh

After fixing when I ran, I got the output as expected.

Now, you can use dos2unix as well to convert the file.

Ramesh
  • 38,687
  • 43
  • 140
  • 215