Что входит в [ ]
это тестовое выражение, а не команда.Что-то вроде [ 5 -gt 4 ]
или [ "foo" = "bar" ]
.Эта команда rsync не имеет никакого смысла как выражение, поэтому вы получаете (не очень понятную) ошибку.
Возможно захватить вывод команды с помощью "$( )"
и проверить, не пусто ли этос оператором теста -n
: if [ -n "$(rsync ...)" ]
, но на самом деле есть лучший способ.То, что идет после if
, само по себе является командой.[
- действительно распространенная команда для использования там, но вы можете использовать любую команду (или конвейер, или что угодно) там.По сути, это «если эта команда выполнена успешно, то ...». Таким образом, вы можете сделать это:
if rsync -ai --dry-run dir1/ dir2/ | grep -q "."; then
Это передает вывод команды rsync
в grep
, ища "."(шаблон, соответствующий любому символу, т. е. есть вывод любой ), а параметр -q
(тихий) запрещает печатать совпадения, просто выйдите с состоянием успеха, если есть хотя бы одно совпадение.