避免 UNIX 和 Linux 中的常见错误(2)

ksh: bar: not found.

您编写了另一个脚本 bar 并把它保存在 ~cormany/scripts 目录中。在使用完整路径或在当前工作目录 (~cormany/scripts) 中执行这个脚本时,它工作正常;但是,由于某种原因,如果在另一个目录中只输入脚本名,就无法运行它:

# pwd /home/cormany/scripts # /home/cormany/scripts/bar This is another test # ./bar This is another test # cd # pwd /home/cormany # bar ksh: bar: not found.  

一切正常,只是无法从另一个目录运行这个脚本。这样的错误消息通常有三种情况:

对于试图执行的文件,您没有权限。 文件不存在或不在您认为的目录中。 文件存在而且在预期的位置,您对这个文件也有足够的权限。

对于试图执行的文件,您没有权限

您知道不是这个原因,因为在提供完全限定的路径时或在命令目录中时能够执行这个脚本。如果不能排除这种可能性,检查文件权限应该有助于发现问题的原因:

# ls -la ~cormany/scripts total 56 drwxr-xr-x 2 cormany atc 512 Jun 12 08:30 . drwxr-xr-x 6 cormany atc 512 Jun 10 08:21 .. -rwxr-xr-x 1 cormany atc 42 Sep 06 16:20 amdc -rw-rw-rw- 1 cormany atc 154 Jan 27 23:23 atc -rwxr-xr-x 1 cormany atc 206 Aug 04 20:57 atc.2 -rwxr-xr-x 1 cormany atc 48 Jun 12 08:21 bar -rwxr-xr-x 1 cormany atc 87 Feb 22 16:11 pac  

执行 ~cormany/scripts/atc 命令会失败,因为这个文件只对用户、组和其他用户设置了读和写权限。只需增加执行权限,即可解决这个问题。

如果无法执行另一个目录中的另一个命令(例如 ~cormany/scripts.old/cujo),那么也应该检查那个文件的权限:

# ls -l ~cormany/other_scripts/cujo ls: 0653-345 /home/cormany/other_scripts/cujo: Permission denied.  

初看上去,您甚至没有读权限。我们来看看目标目录,看看是怎么回事儿:

# cd ~cormany/scripts.old/cujo ksh: /home/cormany/other_scripts: Permission denied. # ls -l ~cormany/scripts.old/cujo ls: /home/cormany/scripts.old: The file access permissions do not allow the specified action. total 0  

这里发生了什么情况?这是另一种形式的权限错误。权限错误不总是出现在文件本身,也可能出现在文件路径中的目录上:

# ls -ld ~cormany/scripts.old d--------- 2 cormany atc 512 Jan 22 08:42 /home/cormany/scripts.old  

如果文件本身有足够的权限,那么纠正目录路径上的权限应该会解决执行问题:

# chmod 755 ~cormany/other_scripts # cd ~cormany/other_scripts # ls –l cujo -rwxr-xr-x 1 cormany atc 48 Jan 26 08:21 cujo  

现在,回到原来 ~cormany/scripts/bar 的问题。

文件不存在或不在您认为的目录中

同样,使用 ls 命令执行快速检查,应该会看到这个文件是否存在:

# ls -l ~cormany/scripts/bar -rwxr-xr-x 1 cormany atc 48 Oct 05 08:21 /home/cormany/scripts/bar  

如果在您原来认为的目录中没有这个文件,就会收到以下消息:

# ls -l ~cormany/scripts/bar ls: 0653-341 The file /home/cormany/scripts/bar does not exist.  

如果您认为这个文件在用户 cormany 的主目录中的其他地方,可以用 find 命令搜索它(如果您有足够的权限的话):

# find ~cormany -name "bar" -ls 16409 1 -rwxr-xr-x 1 cormany atc 48 Sep 06 08:06 /home/cormany/atc/bar 590040 1 -rwxr-xr-x 1 cormany atc 48 Sep 09 08:42 /home/cormany/test/bar  

文件存在而且在预期的位置,您对这个文件也有足够的权限

前面成功执行时采用的方法是提供完全限定的命令路径,或者处于命令目录中并输入当前工作目录(即使用 ./)。既然现在不在命令目录中,也不输入完整路径,我们就来检查一下 PATH 环境变量的值:

# echo ${PATH} /usr/bin:/etc:/usr/sbin:/usr/ucb:/bin:/usr/bin/X11:/sbin:/usr/ Java5/jre/bin:/usr/java5/bin:/usr/ushare/bin:/usr/local/bin  

目录 /home/cormany/scripts 不在路径中。纠正这个问题有两种方法:

在 PATH 中添加 ~cormany/scripts。尽管很容易执行这个修改,但是请记住一点:每在 PATH 变量中添加一个目录,shell 在搜索命令时就会多搜索一个目录。如果随着时间的推移添加了 10 个目录,那么在 shell 返回无法找到文件的结果之前,它要多搜索 10 个目录。如果您确实要这么做,只需执行以下命令: # export PATH=${PATH}:/home/cormany/scripts # echo $PATH /usr/bin:/etc:/usr/sbin:/usr/ucb:/bin:/usr/bin/X11:/sbin:/usr/ java5/jre/bin:/usr/java5/bin:/usr/ushare/bin:/usr/local/bin:/ home/cormany/scripts  

注意:把路径添加到用户的 PATH 变量的开头通常是不明智。这么做可能导致执行不需要的命令。如果您觉得必须把一个路径放在开头,一定要谨慎。

把脚本转移(或复制)到 PATH 变量中已有的目录中。如果多个用户可能使用这个脚本,这种解决方案比较好。如果是这种情况,用户通常把他们的文件放在 /usr/local/bin 中。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/24807.html