c中的“系统”命令使用bash管道给出错误的输出

时间:2018-09-04 14:29:45

标签: c bash pipe

我试图了解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()调用使用管道,则会发生同样的事情。

3 个答案:

答案 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"); }

并将其运行在同一目录中。