Перенаправление вывода программы C на другую программу C с помощью скрипта bash под Linux - PullRequest
1 голос
/ 21 декабря 2011

Я написал две простые программы на C, program1 распечатывает предопределенную строку, а program2 принимает строку в качестве аргумента и записывает эту строку в файл.

То, что я пытаюсь сделать, это взять вывод программы1 и передать его в программу2. Я прошел обучение по bash, и единственное решение, которое я смог найти, было:

program1 | program2

Это должно сработать, но у меня ошибка сегментации. Поэтому я попробовал это, и это работает.

program1 | program2 abc

Как вы можете догадаться, это приводит к выходному файлу, содержащему строку "abc". программа1 | program2 кажется простым, но я думаю, что я что-то здесь упускаю?

Ответы [ 3 ]

4 голосов
/ 21 декабря 2011

| делает программу справа считывающей (как STDIN) STDOUT программы слева.

Но ваш program2 вообще не читает STDIN. Он читает аргументы (которые не являются стандартными).

Вы должны сделать:

program2 `program1`

Bash оценивает program1 (когда видит обратные кавычки) и передает его как аргумент в program2.

На моей клавиатуре обратная клавиша (`) находится слева от клавиши« 1 »и над клавишей LEFT TAB.

EDIT: Если вывод строки program1 содержит пробелы и вы хотите, чтобы вся строка интерпретировалась как один аргумент, заключите строку в кавычки "" или '':

program2 "`program1`"
2 голосов
/ 21 декабря 2011

Я думаю, это также должно работать:

$ program1 | xargs program2
1 голос
/ 21 декабря 2011

Вы сказали: «program2 принимает строку в качестве аргумента».

Система pipe | переопределяет стандартный ввод программы, а не аргумент.

Чтобы принять вывод program1 в качестве аргумента для program2, используйте:

  program2 $(program1)

$() (также можно использовать обратную галочку `, но есть причины этого избегать) берет выходные данные программы и добавляет их в текущую строку, а затем переоценивает их; так что если program1 выводит "foo", команда для запуска будет program2 foo

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...