所以我正在为我正在处理的项目编写代码。这是关于使用文件描述符重定向输入输出和错误。但是错误重定向存在问题。如果我在命令行中,我通常会使用以下命令进行操作:
lsa >& out
此命令将返回向"out"文件写入错误消息,指出"bash:lsa:找不到命令">
在我的项目中,我是这样做的:
./proj ls GTAMP out
错误被重定向到"out"文件,但它将是:"lsa:没有这样的文件或目录">
以下是我的做法
//Before Child
int stdin = dup(0);
int stdout = dup(1);
int stderr = dup(2);
printf("GTAMPn");
int fderr = open(argv[argc-1], O_WRONLY | O_CREAT | O_TRUNC, 0666);
dup2(fderr,2);
dup2(fderr,1);
close(fderr);
//In child
returnVal= fork();
if(returnVal==0)
{
char *args[] = {argv[2],argv[3],argv[4],NULL};
execvp(argv[2], args);
perror(argv[2]);
exit(errno);
}
//In Parent
wait(NULL);
dup2(stdin,0);
dup2(stdout,1);
dup2(stderr,2);
printf("nCommand(s) execution complete.n");
return 0;
找不到命令"不是操作系统级别的错误 - 正如您在代码中演示的那样,这些错误是通过使用perror()
查找与当前errno
关联的字符串来查找
相反,像 bash 这样的 shell 实际上将字符串硬编码command not found
.引用实现( execute_cmd.c
,来自 bash-20180420 快照(:
hookf = find_function (NOTFOUND_HOOK);
if (hookf == 0)
{
/* Make sure filenames are displayed using printable characters */
pathname = printable_filename (pathname, 0);
internal_error (_("%s: command not found"), pathname);
exit (EX_NOTFOUND); /* Posix.2 says the exit status is 127 */
}
为了与另一个shell进行比较,dash
不发出foo: command not found
,而只是发出foo: not found
;这是通过src/error.c
中的errmsg
函数构造的,从src/exec.c
中的shellexec
函数调用:
exerror(EXEND, "%s: %s", argv[0], errmsg(e, E_EXEC));
。调用。。。
const char *
errmsg(int e, int action)
{
if (e != ENOENT && e != ENOTDIR)
return strerror(e);
if (action & E_OPEN)
return "No such file";
else if (action & E_CREAT)
return "Directory nonexistent";
else
return "not found";
}
简而言之:在这两个 shell 中,字符串"找不到命令"都不是源自 shell 本身源代码之外的任何地方。如果你想让你自己的 shell 写这个错误,你应该编写必要的代码来让它这样做。