Bash 重定向“;“未找到命令”;归档

Bash 重定向“;“未找到命令”;归档,bash,command-line-arguments,stderr,Bash,Command Line Arguments,Stderr,所以我正在为我正在进行的一个项目编写代码。它是关于使用文件描述符重定向输入输出和错误。但是错误重定向中存在一个问题。如果我在命令行中,我通常会使用以下命令: lsa >& out 此命令将向“out”文件写入一条错误消息,说明“bash:lsa:command not found” 在我的项目中,我是这样做的: ./proj ls GTAMP out 错误被重定向到“out”文件,但它将是: “lsa:没有这样的文件或目录” 下面是我是怎么做的 //在子对象之前

所以我正在为我正在进行的一个项目编写代码。它是关于使用文件描述符重定向输入输出和错误。但是错误重定向中存在一个问题。如果我在命令行中,我通常会使用以下命令:

    lsa >& out
此命令将向“out”文件写入一条错误消息,说明“bash:lsa:command not found”

在我的项目中,我是这样做的:

    ./proj ls GTAMP out
错误被重定向到“out”文件,但它将是: “lsa:没有这样的文件或目录”

下面是我是怎么做的

//在子对象之前
int stdin=dup(0);
int stdout=dup(1);
int stderr=dup(2);
printf(“GTAMP\n”);
int fderr=open(argv[argc-1],O|u WRONLY | O|u CREAT | O|u TRUNC,0666);
dup2(fderr,2);
dup2(fderr,1);
关闭(fderr);
//在儿童时期
returnVal=fork();
if(returnVal==0)
{
char*args[]={argv[2],argv[3],argv[4],NULL};
execvp(argv[2],args);
perror(argv[2]);
出口(errno);
}
//父母
等待(空);
dup2(stdin,0);
dup2(stdout,1);
dup2(stderr,2);
printf(“\n命令执行完成。\n”);
返回0;
“未找到命令”不是操作系统级错误——正如您在代码中演示的那样,这些错误是通过使用
peror()
查找与当前
errno
关联的字符串来查找的

相反,像bash这样的shell实际上硬编码字符串
命令未找到
。引用bash-20180420快照中的实现(
execute_cmd.c
):

hookf=find_函数(notfind_HOOK);
如果(hookf==0)
{
/*确保使用可打印字符显示文件名*/
路径名=可打印的文件名(路径名,0);
内部_错误(u(“%s:未找到命令”)、路径名);
exit(EX_NOTFOUND);/*Posix.2表示退出状态为127*/
}

与另一个shell相比,
dash
不发出
foo:command not found
,只发出
foo:not found
;这是通过中的
errmsg
函数构造的,从中的
shellexec
函数调用:

exercor(EXEND,“%s:%s”,argv[0],errmsg(e,e_EXEC));
…调用

常量字符*
errmsg(int e,int action)
{
如果(e!=enoint&&e!=ENOTDIR)
返回箭头(e);
如果(行动和E_打开)
返回“无此类文件”;
其他如果(行动和E_创建)
返回“目录不存在”;
其他的
返回“未找到”;
}


简而言之:在这两个shell中,字符串“command not found”都不是源于shell本身的源代码之外的任何地方。如果您希望自己的shell编写该错误,那么应该编写必要的代码使其这样做。

对,“未找到命令”来自bash,而您没有使用bash;如果您想编写自己的错误消息(像bash那样),则需要编写相应的代码。这里的问题是什么?除了使用printf硬编码之外,没有其他方法可以调用“command not found”错误?或者有没有一种替代方法来传递perror或其他一些策略,可以将“没有这样的文件或目录”替换为:Command not found;您将看到
msgid“%s:command not found”
位于其转换表中,通过
internal\u error(“%s:command not found”)、路径名调用