Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Unix 命令:exec echo";这是测试用的&燃气轮机;试验;壳牌如何安排输出重新定向?_Unix_Exec - Fatal编程技术网

Unix 命令:exec echo";这是测试用的&燃气轮机;试验;壳牌如何安排输出重新定向?

Unix 命令:exec echo";这是测试用的&燃气轮机;试验;壳牌如何安排输出重新定向?,unix,exec,Unix,Exec,我试图理解,对于上面的命令,当与shell本身相关联的进程被echo进程替换时,shell如何安排输出重定向?非常感谢您的帮助 问候 Rupam外部命令的输出重定向是通过操纵文件描述符来实现的,通常涉及dup2,这是一种系统调用,用于将文件描述符分配给现有打开的文件。在这种情况下,执行echo的进程的标准输出被指示指向目标输出文件 shell执行以下步骤的近似等效操作: 通过调用创建当前流程的副本;后续步骤发生在子流程中。(当使用exec调用命令时,此步骤将被省略,如您的示例所示。) 打开tes

我试图理解,对于上面的命令,当与shell本身相关联的进程被echo进程替换时,shell如何安排输出重定向?非常感谢您的帮助

问候
Rupam

外部命令的输出重定向是通过操纵文件描述符来实现的,通常涉及
dup2
,这是一种系统调用,用于将文件描述符分配给现有打开的文件。在这种情况下,执行
echo
的进程的标准输出被指示指向目标输出文件

shell执行以下步骤的近似等效操作:

  • 通过调用创建当前流程的副本;后续步骤发生在子流程中。(当使用
    exec
    调用命令时,此步骤将被省略,如您的示例所示。)
  • 打开
    test
    进行写入,并记住文件描述符
  • 通过调用
  • 调用或类似调用,用执行
    echo

  • echo
    命令只是写入标准输出,这是文件描述符1的一个奇特名称。它不在乎最后是否会写入TTY、文件或其他程序。以上步骤确保文件描述符1确实指向打开的文件
    test

    ,感谢您的回复。实际上,在我的系统中,echo是/bin中的一个独立程序。因此,当我使用:exec/bin/echo“this is for test new”>test显式调用该程序时,它将强制shell进程替换为/bin/echo进程。但是输出重定向工作正常。谢谢您的评论。我理解输出重定向部分,但对fork()部分感到困惑(我对Unix比较陌生)。我们调用exec不是为了避免额外进程的分叉吗?那么,从哪里创建子对象呢?此外,会话在执行echo后存在——正如预期的那样,没有要返回的shell进程——但是如果存在子进程,那么从echo退出(或执行它的子shell)应该返回到父shell(我从那里开始会话)。事实并非如此。@RupamBhattacharjee步骤1(fork)对于您给出的命令被省略,该命令以
    exec
    开头。这在步骤1末尾的括号中说明。感谢您的澄清。很抱歉一开始就错过了。问候鲁帕