Пожалуйста, рассмотрите сценарий ниже. Он проверяет две среды, чтобы убедиться, что оба имеют одинаковые наборы имен переменных 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:
Мой вопрос о другом результате двух одинаковых и НЕ отбирает о способах быстрого сравнения файлов.
'echo -e '\ e" '- это башизм. Цикл 'while read' - это, безусловно, антипаттерн. В вашем файле содержатся завершающие пробелы и/или аберрантные символы окончания строки DOS? – tripleee
'> Pu' уже делает пустой файл вывода, поэтому некоторые функции diff тоже сделают это. –
@tripleee Как мой вопрос о двух greps с разным выходом имеет какое-либо отношение к вопросу о быстром сравнении файлов? Я не знаю, что такое башизм, ** echo -e ** был для раскраски имени скрипта. Все файлы создаются в скрипте в ящике Linux, поэтому я подозреваю, что нет «аберрантных символов конца строки DOS». –