2015-10-29 2 views
3

Я хотел бы написать скрипт bash, который печатает команды. Но для удобства чтения я не хочу, чтобы он печатал команды эха. К сожалению, я не могу найти правильные настройки для моего сценария bash для достижения этого. Мне нужна помощь?Команды печати сценария Bash, но не печатать команду эха

#!/bin/bash 

# Makes the bash script to print out every command before it is executed 
set -v 

echo "Cleaning test database" 
RAILS_ENV=test bundle exec rake db:drop 
echo "************************************************************" 
echo "" 

echo "Setting up the test database" 
RAILS_ENV=test bundle exec rake db:setup 
echo "************************************************************" 
echo "" 

Выход выглядит следующим образом:

echo "Cleaning test database" 
Cleaning test database 
RAILS_ENV=test bundle exec rake db:drop 
echo "************************************************************" 
************************************************************ 
echo "" 


echo "Setting up the test database" 
Setting up the test database 
RAILS_ENV=test bundle exec rake db:setup 

Как вы можете видеть, что выводит все команды, в том числе эхо-команды, которые я не хочу видеть.

Есть ли у вас идеи?

Приветствия,

Херардо

+1

Возможно, это ?: '| grep -v "echo" ' – whoan

+0

Будет ли Makefile соответствовать вашей задаче? Это совершенно другой подход, но «make» выполняет эхо каждой команды по умолчанию при ее выполнении, * если * вы не префикс команды с помощью @. – chepner

ответ

6

Вы можете использовать trap DEBUG вместо set -v как один из вариантов.

Например

#!/bin/bash 


# Makes the bash script to print out every command before it is executed except echo 
trap '[[ $BASH_COMMAND != echo* ]] && echo $BASH_COMMAND' DEBUG 

echo "Cleaning test database" 
RAILS_ENV=test bundle exec rake db:drop 
echo "************************************************************" 
echo "" 

echo "Setting up the test database" 
RAILS_ENV=test bundle exec rake db:setup 
echo "************************************************************" 
echo "" 

отладки выполняется после каждой команды.
$ В настоящее время выполняется команда BASH_COMMAND.

BASH_COMMAND Команда в настоящее время выполняются или собирающийся быть выполнена, если оболочка не выполняет команду в результате ловушки, в этом случае является выполнение команд, в то время ловушки.

Таким образом, ловушка просто проверяет, не срабатывала ли последняя команда с эхом и печатает ее.

+1

Thx 123, он отлично работает, и я буду использовать его. Это интересный подход, о котором я не думал. Интересно, есть ли специальные параметры или настройки для моей проблемы. –

+0

@GerardoNavarroSuarez Я не думаю, что есть, но если вы найдете какой-нибудь, дайте мне знать! – 123

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