«Системная» команда в c выдаёт неверный вывод по каналам bash - PullRequest
0 голосов
/ 04 сентября 2018

Я пытаюсь понять внутреннюю работу труб в 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

Может ли кто-нибудь объяснить причину этого несоответствия? То же самое происходит, если я использую канал через pipe() вызов в C.

Ответы [ 3 ]

0 голосов
/ 04 сентября 2018

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

и запустить его в том же каталоге.

0 голосов
/ 04 сентября 2018

На самом деле я понял, что проблема не в ls, а в "grep --color = всегда d", который является псевдонимом grep в моем bash. Цветные символы имеют дополнительную длину, что увеличивает длину вывода.

0 голосов
/ 04 сентября 2018

Проверьте, какова ваша команда 'ls' на bash! Попробуйте:

тип ls

Возможно, вы обнаружите, что ls - это какой-то псевдоним.

Проверьте ваш bash-тест еще раз с

/ bin / ls | grep d | туалет

Если вы получите тот же результат, что и в вашем C-коде, вы узнаете, что пошло не так.

...