C ++ заставил меня пристраститься к силе закрывающей скобки:
(
cd "$targetDirectory"
#...
)
# Whatever (almost) happened in the address space of the subshell
# won't have any effect here
То, что вы хотите, возможно и легко. Просто введите
/your/java/program "$(/your/c/program)"
Нотация $(…)
называется «подстановкой команд». $(command1)
запускает command1
с выводом в канал, захватывает его и помещает в командную строку. Итак,
command2 $(command1)работает
command2
с выходом command1
в качестве аргумента строки команды -. Вы должны добавить кавычки("…"
)для обработки случая где выход из command1
(т. е. ваша программа на C )состоит из нескольких слов (, например,printf("planet earth");
). Это то, о чем вы просите. Я подробно обсуждаю это здесь , где я показываю пример
$ ls -ld "$(date "+%B %Y").txt" -rwxr-xr-x 1 username groupname 687 Apr 2 11:09 April 2018.txt
П.С. Если вы используете очень старую или необычную систему, нотация $(…)
может не работать. В этом случае попробуйте
/your/java/program "`/your/c/program`"
`…`
— старая версия $(…)
. Если $(…)
работает в вашей системе, используйте его.
То, что вы хотите, возможно, но не так просто, как вы пытались. Как вы правильно сказали, конвейер предоставляет ввод, а не аргументы командной строки.
К счастью, существует (стандартная )программа, которая делает именно это:xargs
В мире GNU (Linux )лучшим способом было бы разделение выходных элементов нулевыми байтами:
/your/c/program | xargs --no-run-if-empty -0 /your/java/program
Вы можете легко попробовать это с помощью echo
(, которая в любом случае является командой по умолчанию для xargs
`:
echo '/bin
/etc
/usr' | xargs ls -ld