shell如何处理重定向

时间:2015-11-25 00:40:42

标签: c shell

我必须在C中编写自己的shell代码,目前我正在处理> < >> <<运算符。我处理|(管道)但我无法理解分割我的线的所有优先级。

对于类似ls -la | cat -e ; ps的内容,我会执行ls -la | cat -e,然后执行ps,不会有任何困难。

使用重定向< > << >>运算符的优先顺序是什么?

3 个答案:

答案 0 :(得分:2)

shell按照它们的外观(或从开始到结束命令,从左到右)处理重定向操作符。

此行为为specified by POSIX

  

如果使用命令指定了多个重定向运算符,则   评估顺序从始至终。

答案 1 :(得分:2)

从左向右扫描,停止并执行您在if (empty($redirect)) { $redirect_uri = $request->query->get('Redirect'); } else { 看到的内容。 ;可能有点棘手,因为你必须记住终结者<<之后的其余部分,并在你阅读&#34之后回到剩下的部分;在线&#34;数据

考虑:

;

输出:

cat << EOF | cat | cat | cat | cat ; echo hello
abc
EOF
echo world

这是一个稍微复杂的版本:

abc
hello
world

输出:

cat << EOF | cat | cat | cat | cat ; echo hello ; cat << EOF ; echo day
abc
EOF
turkey
EOF
echo world

答案 2 :(得分:0)

此问题dupdup2系统调用的最简单答案。

如需更多见解,请按照以下代码

#include <sys/types.h>
#include <unistd.h>
#include <stdio.h>
#include <string.h>
#include <errno.h>

#define READ_END 0
#define WRITE_END 1

int 
main(int argc, char* argv[]) 
{
  pid_t pid;
  int fd[2];

  pipe(fd);
  pid = fork();

  if(pid==0)
   {
     printf("i'm the child used for ls \n");
     dup2(fd[WRITE_END], STDOUT_FILENO);
     close(fd[WRITE_END]);
     execlp("ls", "ls", "-al", NULL);
   }
  else
   { 
     pid=fork();

     if(pid==0)
      {
        printf("i'm in the second child, which will be used to run grep\n");
        dup2(fd[READ_END], STDIN_FILENO);
        close(fd[READ_END]);
        execlp("grep", "grep", "alpha",NULL);
    }
}

return 0;
}

简而言之dupdup2所做的是,当运行命令并将其映射到任何stdout机制时,它们会关闭您的默认IPC,{{1} }。因此,当命令运行时,他们不会在屏幕上吐出输出。相反,他们把它扔到pipe现在由IPC系统调用创建的另一个子进程,该进程正在监视fork现在被激活的任何输入并且它接受来自前一命令的输入&#39 ;输出并在其上运行另一个命令,然后最终将输出抛出屏幕。

现在,就顺序而言,首先运行对任何其他命令具有最小/无依赖性的命令,然后运行其他命令。有时它取决于你如何编写命令。有关偏好的更多信息,请按照posix指南