【问题标题】:"System" command in c giving wrong output with pipes of bashc中的“系统”命令使用bash管道给出错误的输出
【发布时间】:2018-09-04 14:29:44
【问题描述】:

我试图了解 C 中管道的内部工作。我注意到如果我运行

int main() { 
    system("ls | grep d | wc");                        
}

输出:

3       3      53

但是在使用 bash 运行相同的命令时,我得到了

3       3      104

ls 的输出 | grep

question_1.pdf question_2.pdf question_2_dataset.txt

有人能解释造成这种差异的原因吗? 如果我通过 C 中的 pipe() 调用使用管道,也会发生同样的事情。

【问题讨论】:

  • 去掉wc。两种情况下ls | grep d的输出是什么?
  • ls 通常是交互式 shell 中的别名。 command ls |grep d | wc 是做什么的?
  • 程序的子系统外壳和终端外壳的当前工作目录是否相同?
  • 从命令行输入时\ls | grep d | wc 的输出是什么? alias | grep ls 的命令行输出怎么样?
  • @Cornstalks 是同一个目录

标签: c bash pipe


【解决方案1】:

实际上,我发现问题不在于 ls,而在于“grep --color=always d”,它是我 bash 中 grep 的别名。彩色字符有额外的长度,增加了输出的长度。

【讨论】:

  • system() 不会启动 bash,它会启动一个新的非交互式 sh(没有定义任何别名)——或者你是说你是在 比较结果重击?
  • 是的,我正在与 bash 结果进行比较
【解决方案2】:

看看你在 bash 中的 'ls' 命令是什么!试试:

输入 ls

您可能会发现ls 是某种别名。

再次检查您的 bash 测试

/bin/ls | grep d |厕所

如果你得到与你的 C 代码相同的结果,你就会知道哪里出了问题。

【讨论】:

  • 它是 3 3 104。字符数只有 53 个。为什么 104 来自 /bin/ls ?
  • ls 别名为 `ls -G' 是“type ls”的输出
【解决方案3】:

ls 通常是交互式 shell 中的别名。 例如,在我的 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"); }

并在同一目录中运行它。

【讨论】:

  • sh -c 'ls | 的输出grep d | wc' 与 system("ls|grep d|wc") 相同,但是当我在 .bashrc 和 .bash_profile 中检查 'ls' 的别名时,它的别名为“ls -G”,其中 G 仅用于彩色输出。我无法弄清楚这种差异究竟来自哪里
  • @MeghaAgarwal 有多个 shell 配置文件。最好尝试直接使用alias lstype ls 查询您的交互式shell,看看它到底是什么。其他命令也可能是别名。玩它。尝试修改管道(例如,删除 |wc 部分)并查看发生了什么。交互是交互式 shell 所擅长的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-12-07
  • 1970-01-01
  • 1970-01-01
  • 2015-04-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多