2010-07-20 2 views
8

Можно ли добавить пробелы слева от каждого выхода в stdout (и stderr, если возможно), когда я запускаю команды в сценарии оболочки bash?Добавление пробелов в stdout

Я хотел бы сделать что-то вроде:

#!/bin/bash 
echo Installing: Something 
echo " => installing prerequisite1" 

## INSERT MAGICAL LEFT SPACES COMMAND HERE ## 

apt-get install -q -y prerequisite 

## ANOTHER MAGICAL CANCELLING LEFT SPACES COMMAND HERE ## 

echo " => installing prerequisite2" 
# ... the padding again ... 
wget http://abc.com/lostzilla.tar.gz 
tar vzxf lostzilla.tar.gz 
cd lostzilla-1.01 
./configure 
make && make install 
# ... end of padding ... 

echo Done. 

Любая идея?

EDIT: Добавлены кавычки в команду echo, иначе они не будут дополнены.

ответ

10

Да, вы можете цитировать их для простых вещей:

echo ' => installing prerequisite1' 

и передать выходные данные через sed для сложных вещей:

tar vzxf lostzilla.tar.gz 2>&1 | sed 's/^/ /' 

2>&1 помещает стандартный вывод и стандартный поток ошибок на поток стандартного вывода а sed заменяет каждый маркер начала строки тремя пробелами.

Насколько хорошо это будет работать на чем-то вроде wget, который выполняет всевозможные манипуляции с курсорами. Я не уверен.

Пример показан здесь:

pax> ls -1 p* 
phase1.py 
phase1.sh 
phase2.py 
phase2.sh 
primes.c 
primes.exe 
primes.sh 
primes.stat 

pax> ls -1 p* | sed 's/^/ /' 
    phase1.py 
    phase1.sh 
    phase2.py 
    phase2.sh 
    primes.c 
    primes.exe 
    primes.sh 
    primes.stat 

Один трюк я использовал в прошлом, чтобы гарантировать, что сами скрипты заботиться о вдавливания:

#!/bin/bash 
if [[ "${DONT_EVER_SET_THIS_VAR}" = "" ]] ; then 
     export DONT_EVER_SET_THIS_VAR=except_for_here 
     $0 | sed 's/^/ /' 
     exit 
fi 
ls -1 p* 

Это будет повторно запустить скрипт с отступом через sed, если он еще этого не делает. Таким образом, вам не нужно беспокоиться об изменении всех ваших выходных операторов. Я знаю немного, но я стараюсь просто делать то, что необходимо для быстрых и грязных сценариев оболочки.

+0

Я могу использовать wget -q для вывода вывода. Но я думаю, что ваша идея очень крутая. Я попробую. Благодаря! – kolrie

+1

Из 'wget (1)', о индикаторе выполнения: «Если вывод не является TTY, по умолчанию будет использоваться« точка ».» Я сделал это, и все получилось хорошо. Спасибо за аккуратный трюк. – sarnold

2

В зависимости от того, как команда записывает на стандартный вывод, вы можете просто отступы с помощью простого AWK сценария:

$ echo -e 'hello\nworld' | awk '{print " ",$0}' 
    hello 
    world 
4

Если вы хотите, чтобы включить интервал включения и выключения, используйте следующий AWK сценария:

#!/usr/bin/gawk -f 

/^#SPACEON/ { spaces=1; } 
/^#SPACEOFF/ { spaces=0; } 
!/^#SPACE/ { 
    if(spaces) { 
     print " " $0; 
    } else { 
     print $0; 
    } 
} 

Обратите внимание, что у вас есть небольшие проблемы с вашей сменой bash. Примечательно, что использование => в ваших операциях эха выводит символ = в файл «установка».

#!/bin/bash 

echo Installing: Something 
echo '=> installing prerequisite1' 

echo '#SPACEON' 

echo You would see apt-get install -q -y prerequisite 

echo '#SPACEOFF' 
echo '=> installing prerequisite2' 
echo '#SPACEON' 


echo You would see wget http://abc.com/lostzilla.tar.gz 
echo You would see tar vzxf lostzilla.tar.gz 
echo You would see cd lostzilla-1.01 
echo You would see ./configure 
echo You would see make \&\& make install 

echo '#SPACEOFF' 
echo Done. 

Объединяя два дает мне:

$ ./do-stuff | ./magic-spacing 
Installing: Something 
=> installing prerequisite1 
    You would see apt-get install -q -y prerequisite 
=> installing prerequisite2 
    You would see wget http://abc.com/lostzilla.tar.gz 
    You would see tar vzxf lostzilla.tar.gz 
    You would see cd lostzilla-1.01 
    You would see ./configure 
    You would see make && make install 
Done. 

Где-материал ваш Баш скрипт и магический шаг мой AWK сценария выше.

+0

Можно ли встроить фрагмент awk в скрипт bash, выполнив что-то вроде/usr/bin/gawk -F << EOF ... EOF? Я попробую! – kolrie

+0

@kolrie - Вы могли бы, но вам нужно было бы перенаправить stdout в этот встроенный фрагмент awk. Возможно, поместив основное тело в функцию, а затем перенаправляя вывод функции в фрагмент? – bstpierre

1

Совсем не-магическая вы можете использовать Printf сделать следующее:

# space padding for single string 
printf "%-4s%s\n" "" "=> installing prerequisite1" 

# space padding for single command output 
# use of subshell leaves original IFS intact 
(IFS=$'\n'; printf " %s\n" $(command ls -ld * 2>&1)) 

# note: output to stderr is unbuffered 
(IFS=$'\n'; printf " %s\n" $(command ls -ld * 1>&2)) 

Также можно сгруппировать команды, заключив их в фигурные скобки и пространственно-Padd их выход так:

{ 
cmd1 1>&2 
cmd2 1>&2 
cmd3 1>&2 
} 2>&1 | sed 's/.*/ &/' 
0

можно перенаправить стандартный вывод на стандартный вывод скрипта/оболочки шириной с помощью ехес ...

( 
exec 1>&2 
command ls -ld * 
) 2>&1 | sed 's/^/ /' 
0

Использовать python pyp (The Pyed Piper):

ls -ld | pyp "' '+p" 
+0

Хотя этот код может ответить на вопрос, предоставляя дополнительный контекст относительно _how_ и/или _why_, он решает проблему, улучшив долгосрочную ценность ответа. –

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