我必须在C中编写自己的shell代码,目前我正在处理> < >> <<
运算符。我处理|
(管道)但我无法理解分割我的线的所有优先级。
对于类似ls -la | cat -e ; ps
的内容,我会执行ls -la | cat -e
,然后执行ps
,不会有任何困难。
使用重定向< > << >>
运算符的优先顺序是什么?
答案 0 :(得分:2)
答案 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)
此问题dup
和dup2
系统调用的最简单答案。
如需更多见解,请按照以下代码
#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;
}
简而言之dup
和dup2
所做的是,当运行命令并将其映射到任何stdout
机制时,它们会关闭您的默认IPC
,{{1} }。因此,当命令运行时,他们不会在屏幕上吐出输出。相反,他们把它扔到pipe
现在由IPC
系统调用创建的另一个子进程,该进程正在监视fork
现在被激活的任何输入并且它接受来自前一命令的输入&#39 ;输出并在其上运行另一个命令,然后最终将输出抛出屏幕。
现在,就顺序而言,首先运行对任何其他命令具有最小/无依赖性的命令,然后运行其他命令。有时它取决于你如何编写命令。有关偏好的更多信息,请按照posix指南