Как отобразить различия двух файлов в скрипте Bash?
Я пытаюсь сравнить содержимое двух файлов в скрипте bash.
local_file=$(cat my_local_file.txt)
remote_file=$(curl -s "http://example.com/remote-file.txt")
if [ local_file == remote_file ]; then
echo "Files are the same"
else
echo "Files are different. Here is the diff:"
diff <(echo "$local_file") <(echo "$remote_file")
fi
Когда я запускаю скрипт, я вижу, что у меня есть синтаксическая ошибка:
./bin/check_files.sh: line 8: syntax error near unexpected token `('
./bin/check_files.sh: line 8: ` diff <(echo "$local_file") <(echo "$remote_file")'
Что я делаю неправильно? Как я могу отобразить diff этих двух строк из скрипта bash?
3 ответа
Подстановка процессов - это функция bash, которая обычно недоступна в /bin/sh
который предназначен для совместимости с POSIX.
Обязательно используйте следующую строку shebang, если вы хотите запустить скрипт как исполняемый файл:
#!/bin/bash
вместо
#!/bin/sh
или использовать
bash script.sh
вместо
sh script.sh
если вы запустите это так
Чтобы скрипт работал с POSIX-совместимыми оболочками, я просто скачал файл и сравнил его с локальным файлом. Удалить загруженный файл после различий.
В добавок к <(command)
(замена процесса) синтаксическая проблема, ваш код if [ local_file == remote_file ]
сравнивает буквенные строки local_file
а также remote_file
, а не содержание переменных. Тебе нужно $local_file
а также $remote_file
сравнить содержимое. Нужно заключать их в двойные кавычки, чтобы избежать проблем с разделением слов.
Вы могли бы сделать это:
#!/bin/bash
local_file=$(< my_local_file.txt) # this is more efficient than $(cat file)
remote_file=$(curl -s "http://example.com/remote-file.txt")
if [ "$local_file" = "$remote_file" ]; then
echo "Files are the same"
else
echo "Files are different. Here is the diff:"
diff <(printf '%s' "$local_file") <(printf '%s' "$remote_file")
fi
Как указано @dimo414, ограничение здесь заключается в том, что подстановка команд $(...)
удаляет завершающие символы новой строки, и это может вызвать проблемы. Итак, лучше скачать удаленный файл и сравнить его с локальным файлом:
local_file=my_local_file.txt
curl -s "http://example.com/remote-file.txt" -o remote_file
if diff=$(diff -- "$local_file" remote_file); then
echo "Files are the same"
else
echo "Files are different. Here is the diff:"
printf '%s' "$diff"
fi
Вы также можете использовать следующую команду:
cmp -b "File_1.txt" "File_2.txt"