2015-01-15 6 views
1

Я пытаюсь распечатать вывод, выводимый из команды, переданной в сценарий bash. Проблема, которую я пытаюсь решить, заключается в том, как заставить вывод выглядеть так, как если бы вы запускали команду из оболочки. Например, когда я запускаю ls, я вижу разные цвета для каталогов и файлов.Показать точный вывод команды Unix из сценария Bash

Вот некоторые примеры кода, что я до сих пор:

#!/bin/bash 

command="[email protected]" 
output=`$command` 
echo "$output" 

Так что мой сценарий оболочки занимает в команде, выполняет команду, а затем выводит на выходе. Я знаю, что я могу настроить цвет вывода с использованием цветовых кодов и echo -e, но я хочу, чтобы результат выглядел так же, как и при запуске команды из оболочки. Любая идея, как я могу это сделать?

ответ

1

Если вам нужно отобразить вывод, вы можете запустить встроенную команду внутри вашего скрипта (просто позвольте ей напрямую писать в stdout, не сохраняя свой вывод в некоторой переменной).

То есть, вы можете заменить:

output=`$command` 
echo $output 

с:

$command 

или

eval $command 

Если вам также необходимо, что выход для некоторого вида обработки, которая была бы немного сложно. Вы можете (например) использовать | tee /var/tmp/some-temp-file.$$, а затем прочитать результат из временного файла.

0

Некоторые программы, такие как ls, проверяют стандартный вывод isatty() и ведут себя по-разному в зависимости от этого. Если вы захватываете вывод команды в переменной, оболочка перенаправляет свой стандартный вывод на канал, который не является TTY.

Существует не так много, что вы можете сделать по этому поводу, за исключением чтения страницы руководства для каждой отдельной команды, чтобы узнать, поддерживает ли она специальные параметры, которые делают его поведение независимым от того, идет ли его стандартный вывод. В частности, для ls вы можете использовать программу dir, которая в качестве альтернативы всегда будет производить дружественный для людей столбцов.

На более общем уровне: то, что вы пытаетесь сделать, похоже, является довольно странной вещью. Я уверен, что есть более надежное решение, чтобы сделать то, что вы пытаетесь выполнить.

+0

Для программы 'ls' и хотите получить цвет, если вам повезет, ваш' ls' поддерживает опцию '--color'. Итак, 'output = $ (ls --color); printf% s "$ output" будет делать трюк. Чтобы проверить, как работает ваша программа при подключении к каналу, вы всегда можете указать: 'mycommand | cat'. –

+0

То, что я пытаюсь сделать, - это быстро и просто выполнить команду в нескольких каталогах/проектах. Например, если я хочу запустить команду «git status» в 8 разных проектах, чтобы увидеть, что изменилось локально, я не хочу запускать команду в 8 разных каталогах. Основными командами, которые я буду использовать, являются команды git и gradle, поэтому я буду смотреть на них конкретно.Код выше и команда «ls» - это просто упрощенные версии более крупной проблемы, которую я пытаюсь решить. – mdurban

0

Почему не просто сценарий как:

#!/bin/bash 
"[email protected]" 

Он будет работать в любой командной строке, передаваемый в качестве аргумента и распечатать вывод неизмененной.

Смежные вопросы