- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
"和 "<")-6ren"> "和 "<")-我应该用 C 编写一个简单的自定义 shell,它可以仅使用“”命令处理重定向。 为此,我解析每个命令(在字符串数组中),检查字符“”,然后使用 open(fd, filename, flags) o-6ren">
我应该用 C 编写一个简单的自定义 shell,它可以仅使用“<”和“>”命令处理重定向。
为此,我解析每个命令(在字符串数组中),检查字符“<”和“>”,然后使用 open(fd, filename, flags)< 打开一个文件名
读取或写入。
如果我发出这些命令(其中 % 表示我的 shell),我希望得到以下输出:
% echo hello > output.txt
% cat output.txt
hello
但是,当我发出这些命令时,实际上是任何命令,它似乎忽略(但不是忽略?)我的重定向。这是我发出相同命令时发生的情况:
% echo hello > output.txt
% cat output.txt
hello > output.txt
奇怪的是,它确实创建了一个名为“output.txt”的文件,并向其中写入“hello > output.txt”
输入和输出重定向器都会发生这种情况。这里只是打开和执行输出命令的代码。
int fd;
open_write_file(&fd, commands[index]);
dup2(fd, 1);
execvpe(commands[0], commands, envp);
close(fd);
注意 open_write_file()
打开文件名,带有标志 O_WRONLY | O_TRUNC | O_CREAT,S_RUSR | S_IRGRP | S_IWGRP | S_IWUSR
并进行错误检查以确保其正确打开。我该如何解决这个问题并让它真正执行我想要的命令?
最佳答案
open
的语法是fd = open(path, flags, [mode]);
如果是>
, 你最好使用 fd = creat(path, mode);
系统调用,默认情况下会覆盖和创建。
解析时,execvpe
的 argv 数组应该包括直到但不包括第一个重定向符号 >
的参数或 <
. argv 数组应具有最后一个 NULL 指针元素以指示其结束。
重定向应该发生在 fork()
之后子进程中的系统调用,否则你的 shell 将失去其标准 IO 和 exec
会彻底消灭它。
/* Parse input line, create argv array, and inputfile/outputfile names */
...
if (fork() == 0) {
/* Child process: stdin redirection */
fd_in = open(inputfile, O_RDONLY);
close(0);
dup(fd_in);
close(fd_in);
/* Child process: stdout redirection */
fd_out = creat(outputfile, 0644);
close(1);
dup(fd_out);
close(fd_out);
/* Child process: exec other program */
execvp(argv[0], argv); /* Does NOT return */
} else {
/* Parent process: wait until child process exits */
wait();
}
关于 exec
的含义存在普遍的误解系统调用系列。他们只是简单地丢弃当前程序并用当前进程中的另一个程序替换它。他们不会回来,因为无处可去。
人们通常的意思,可以用 fork
来完成exec
wait
系统调用,见上文。
关于c - 在 C 的自定义 shell 中执行重定向( ">"和 "<"),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28493392/
我相信我在子 shell 中调用 exit 会导致我的程序继续: #!/bin/bash grep str file | while read line do exit 0 done
我相信我在子 shell 中调用 exit 会导致我的程序继续: #!/bin/bash grep str file | while read line do exit 0 done
我有几个脚本,它们的第一部分看起来是一样的。这部分的功能是识别脚本在哪台机器上运行并相应地设置几个变量。它看起来像这样: ENV=`echo $LOGNAME | cut -c1-8` if
这是我正在尝试做的事情。我有 4 个 shell 脚本。脚本 1 需要先运行,然后是 2,然后是 3,然后是 4,并且它们必须按此顺序运行。脚本 1 需要运行(并在后台等待)2 才能正常运行,但是脚本
我有一个名为 a.sh 的脚本,其中的内容是: //a.sh: #!/bin/bash temp=0 while [ "$temp" -ne 500 ] do echo `date`
在snakemake中,使用shell()函数执行多个命令的推荐方式是什么? 最佳答案 您可以调用shell()多次内run规则块(规则可以指定 run: 而不是 shell: ): rule pro
我有一个 shell 脚本,我向其中传递了一些参数。Test1.sh -a 1 -b 2 -c“一二三” 在 Test1.sh 中,我按以下方式调用另一个 shell 脚本。Test2.sh $* 我
我有 2 个 shell 脚本。 第二个shell脚本包含以下函数第二个.sh func1 func2 first.sh 将使用一些参数调用第二个 shell 脚本, 将使用特定于该函数的一些其他参数
我有一个 Unix shell 脚本 test.sh。在脚本中,我想调用另一个 shell,然后从子 shell 执行 shell 脚本中的其余命令并退出 说清楚: test.sh #! /bin/b
我想在 shell 脚本中更改路径环境变量。路径变量需要在shell脚本执行后修改。 最佳答案 我知道有两种方法可以做到这一点。第一种是在当前 shell 的上下文中运行脚本: . myscript.
此 shell 脚本按预期运行。 trap 'echo exit' EXIT foo() { exit } echo begin foo echo end 这是输出。 $ sh foo.sh
我正在使用 vimshell在 vim 中执行命令 nnoremap vs :VimShellPop 使用此键映射,我可以打开 vim shell 并执行诸如“捆绑安装”之类的命令,然后 输入 exi
我想连接到不同的 shell(csh、ksh 等)并在每个切换的 shell 中执行命令。 下面是反射(reflect)我的意图的示例程序: #!/bin/bash echo $SHELL csh e
我目前正在尝试使用 BNF 和 LL 解析器在 C 中重新编写 shell。 否则,我需要知道 shell 运算符的优先级是什么| , > , > , & , ; ? 有没有人可以提供给我? 谢谢 最
不幸的是,我没有suspend 命令(busybox/ash)。但是我可以使用 kill -STOP $$ 从后台 shell (sh &) 返回到父 shell(以及 fg 之后)。 但是我不想输入
我需要知道,当用户切换到另一个 shell 时,通过单击它。 我试过 shellListener.shellDeactivated()但是当 shell 失去对它自己的控件的焦点时,会触发此事件,这意
file1.txt aaaa bbbb cccc dddd eeee file2.txt DDDD cccc aaaa 结果 bbbb eeee 如果能不区分大小写就更好了! 谢谢! 最佳答案 gre
我见过解压缩目录中所有 zip 文件的循环。但是,在运行此之前,我宁愿确保我将要运行的内容正常工作: for i in dir; do cd $i; unzip '*.zip'; rm -rf *.z
我对编程还很陌生,但我想知道 vim、emacs、nano 等 shell 文本编辑器如何能够控制命令行窗口。我主要是一名 Windows 程序员,所以可能在 *nix 上有所不同。据我所知,只能将文
我有一个包含第 7 列日期的文件,我的要求是将它与今天的日期进行比较,如果小于它,则删除该完整行。 此外,如果第 7 列中提到的任何日期超过 15 天,则将其修改为最多 15 天 下面的例子- now
我是一名优秀的程序员,十分优秀!