我遇到了一个看起来很奇怪的shell问题,在$ PATH中有一个命令,该命令(shell(ksh,在Linux上运行)似乎胆怯地拒绝调用)。在不完全限定命令的情况下,我得到:
# mycommand
/bin/ksh: mycommand: not found [No such file or directory]
但是可以通过以下方式找到文件:
# which mycommand
/home/me/mydir/admbin/mycommand
我还明确地在$ PATH中看到该目录:
# echo $PATH | tr : '\n' | grep adm
/home/me/mydir/admbin
该位置的exe似乎正常:
# file /home/me/mydir/admbin/mycommand
/home/me/mydir/admbin/mycommand: setuid setgid ELF 64-bit LSB executable, x86-64, version 1 (SYSV), for GNU/Linux 2.6.4, dynamically linked (uses shared libs), not stripped
# ls -l mycommand
-r-sr-s--- 1 me mygroup 97892 2012-04-11 18:01 mycommand
如果我使用完全限定的路径显式运行它:
# /home/me/mydir/admbin/mycommand
我看到了预期的输出。肯定会使这里的外壳有些混乱,但我茫然不知所措?
编辑:查找看起来像一个类似的问题:使用路径运行时,二进制文件将不会执行。例如> ./ program无效,但> program正常
我还在$ PATH中测试了多个这样的命令,但只找到了一个:
# for i in `echo $PATH | tr : '\n'` ; do test -e $i/mycommand && echo $i/mycommand ; done
/home/me/mydir/admbin/mycommand
编辑2:
从今天早上开始,问题消失了,现在我可以执行可执行文件了。
可以认为这可以验证注销和登录的建议,但是我昨晚这样做并没有成功。该注销/登录也应该等效于运行建议的'hash -r'命令(该fwiw似乎也是ksh内置的,而不仅仅是bash内置的)。
针对某些答案:
这是可执行文件,而不是脚本(请参阅文件命令输出中的ELF参考)。
我认为一点努力不会有所帮助。最终迫使该命令执行完全限定的命令。我想我可以在当前shell上完成strace附加,但是由于我再也无法复制,因此没有必要尝试这样做。
$ PATH中没有分号。由于我无法再进行复制,因此我不会用完整的$ PATH弄乱这个问题。
如建议的那样,尝试另一个shell(即bash)将是我也尝试过的事情。随着问题的解决,我现在不知道这是否会有所帮助。
还建议我检查目录权限。这样做,对于直到该目录的每个目录,我都会看到:
# ls -ld $HOME $HOME/mydir $HOME/mydir/admbin
drwxr-xr-x 10 me root 4096 2012-04-12 12:20 /home/me
drwxrwsr-t 22 me mygroup 4096 2012-04-12 12:04 /home/me/mydir
drwxr-sr-x 2 me mygroup 4096 2012-04-12 12:04 /home/me/mydir/admbin
$ HOME目录所有权被弄乱了(不能是根组)。那可能会导致其他问题,但是我不知道它将如何导致这一问题。