我试图了解C语言中管道的内部工作。我注意到如果我运行
int main() {
system("ls | grep d | wc");
}
输出:
3 3 53
但是在使用bash运行相同的命令时,我得到了
3 3 104
ls的输出| grep d
question_1.pdf Question_2.pdf Question_2_dataset.txt
有人可以解释这种差异的原因吗?
如果我通过C中的pipe()
调用使用管道,则会发生同样的事情。
答案 0 :(得分:1)
实际上,我发现问题不是ls,而是“ grep --color = always d”,这是我bash中grep的别名。彩色字符有额外的长度,这会增加输出的长度。
答案 1 :(得分:0)
检查一下bash中的“ ls”命令是什么!试试:
类型ls
您可能会发现ls
是某种别名。
使用
再次检查您的bash测试/ bin / ls | grep d | wc
如果您随后获得与C代码相同的结果,您将知道出了什么问题。
答案 2 :(得分:0)
ls通常是交互式外壳程序中的别名。
例如,在我的bash会话中,如果我type ls
会得到
ls is aliased to `ls -t --group-directories-first -I .pyc -I __pycache__ -I .git --color=auto -xF'
(别名通常来自$ HOME/.bashrc
或/etc/bash.bashrc
)。
现在,如果您这样做:
sh -c 'ls | grep d | wc'
(或command ls| command grep d | command wc
),您应获得与编译完全相同的结果
int main() { system("ls | grep d | wc"); }
并将其运行在同一目录中。