我也在尝试从基本名称中获取命令。这就是为什么我在解析行后使用类似这样的原因...

 while (*line == ' ' || *line == '\n')
                       *line++ = '\0';

                    line = basename(line);  // base
                    *argv++ = line;


好的基名似乎工作正常,但是如果我输入ls -l之类的命令,则会出现错误...

输入输出是这样的

ls
arg[0]: 'ls' and arg[1]: '(null)'
shellTest

bin/ls
arg[0]: 'ls' and arg[1]: '(null)'
shellTest

ls -l
arg[0]: '-l' and arg[1]: '-l'
Execution of the command is failed
: No such file or directory


如果我删除line = basename(line);,那么除了基本名称之外,其他所有东西都在工作,所以解析不能成为问题...

我该如何解决这个问题?

最佳答案

问题可能出在使用basename()的周围代码中。 basename()的POSIX标准说:


  描述
  
  basename()函数应采用path指向的路径名,并返回指向该路径名最后一部分的指针,删除任何尾随的'/'字符。
  
  如果路径指向的字符串完全由'/'字符组成,则basename()应返回指向字符串"/"的指针。如果path指向的字符串恰好是"//",则返回'/'还是"//"由实现定义。
  
  如果path为空指针或指向空字符串,则basename()应返回指向字符串"."的指针。
  
  basename()函数可以修改path指向的字符串,并可以返回指向静态存储的指针,然后可以通过随后对basename()的调用将其覆盖。
  
  basename()函数不必是线程安全的。
  
  返回值
  
  basename()函数应返回一个指向路径最后一部分的指针。


该规范中有很多麻烦的地方。

但是看起来有点像您尝试使用相同的空间同时存储两个值,但未成功。

关于c - Shell基本名称错误,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/7170150/

10-11 16:38