2016-08-06 4 views
0

Пожалуйста, рассмотрите сценарий ниже. Он проверяет две среды, чтобы убедиться, что оба имеют одинаковые наборы имен переменных env. Проблема начинается с строки второго grep. Если файлы Ds1 и Ps1 те же, Du не производится вообще. Однако первый grep создает пустой файл Pu.grep файл из другого файла работает только одним способом. Зачем?

Еще одна странная вещь. Если я запустил сценарий с ./script проблема возникает, если я использую bash script, обе линии grep ведут себя одинаково, производя два пустых файла.

Любое объяснение? Как я могу заставить их работать одинаково независимо от метода вызова?

#!/bin/bash -e 

# Script name, added to console prints 
action="\e[32m"${0}"\e[39m" 

exit_code=0 

echo -e ${action}": Start of script." 
echo 

#get var names from both files 
awk '{print $1}' Ds > Ds1 
awk '{print $1}' Ps > Ps1 

# Get vars not in Dev 
grep -Fxvf Ds1 Ps1 > Pu 
# Get vars not in Prod 
grep -Fxvf Ps1 Ds1 > Du 

# If there are vars unique to Dev, print them 
if [ -s Du ]; then 
    echo -e ${action}": List of env variables unique to Dev:" 
    echo 

    while read p; do 
    cat Ds | grep $p 
    done < Du 
    echo 
    exit_code=1 
fi 

# If there are vars unique to Prod, print them 
if [ -s Pu ]; then 
echo -e ${action}": List of env variables unique to Prod:" 

    while read line; do 
    cat Ps | grep $line 
    done < Pu 
    exit_code=1 
fi 

exit ${exit_code} 

Вот часть DS1 файл, если необходимо:

AMBURAPP_ACCESS_TOKEN 
AWS_ACCESS_KEY_ID 
AWS_DB_BACKUP_REGION 
AWS_DB_BACKUP_S3_BUCKET_NAME 
AWS_SECRET_ACCESS_KEY 
AWS_USER_NAME 
BUNDLE_WITHOUT 
DB_ENDPOINT 
DB_NAME 
DB_PASSWORD 
DB_PORT 
DB_USER 
DEVISE_SECRET_KEY 
DOMAIN 
INTERCOM_API_KEY 
MANDRILL_SUBACCOUNT 
MANDRILL_USERNAME 
PARAM5 

не работает дифф Ds1 PS1 возвращает ничего, то есть разница рассматривает оба файла идентичны Насколько нам известно.

EDIT:

Мой вопрос о другом результате двух одинаковых и НЕ отбирает о способах быстрого сравнения файлов.

+0

'echo -e '\ e" '- это башизм. Цикл 'while read' - это, безусловно, антипаттерн. В вашем файле содержатся завершающие пробелы и/или аберрантные символы окончания строки DOS? – tripleee

+0

'> Pu' уже делает пустой файл вывода, поэтому некоторые функции diff тоже сделают это. –

+0

@tripleee Как мой вопрос о двух greps с разным выходом имеет какое-либо отношение к вопросу о быстром сравнении файлов? Я не знаю, что такое башизм, ** echo -e ** был для раскраски имени скрипта. Все файлы создаются в скрипте в ящике Linux, поэтому я подозреваю, что нет «аберрантных символов конца строки DOS». –

ответ

1

Запуск сценария с -e приводит к его прерванию при сбое команды, например, когда grep не дает соответствия.

Исправление состоит в том, чтобы явно обрабатывать все возможные ошибки. Чтобы игнорировать ошибку, вы можете использовать что-то вроде

grep foo bar || true 
+0

Я уверен, что это дубликат другого вопроса, чем тот, который я изначально назначил, но я не могу быстро найти обман. Указатели очень ценят. – tripleee

+0

-Е требуется мой босс, а не мой выбор. Что вы думаете о том, что grep работает в одной строке, а затем не работает над следующим? Это моя главная проблема. –

+0

Когда 'Pu' пуст, результирующая ошибка из' grep' завершает сценарий. Я действительно не понимаю, как лучше объяснить обходное решение.'grep -Fxvf Ds1 Ps1> Pu || true' и аналогичным образом в другом месте скрипта, где 'grep' не может выполнить совпадения. – tripleee