Как отобразить различия двух файлов в скрипте 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"
Другие вопросы по тегам