Почему две машины Linux ведут себя по-разному при выполнении команд с одинаковым синтаксисом?

Почему две машины Linux ведут себя по-разному при выполнении команд с одинаковым синтаксисом?

Я использую 2 машины, которые обеRed Hat Enterprise Linux AS, выпуск 3 (обновление Taroon 2) (Я проверяю это в /etc/*-release).

Я проверил, что они используют одну и ту же оболочку по умолчанию ps -p $$, а именно bash.

Я попытался выполнить команду поиска с подстановочным шаблоном: find path -name pattern -type f -ctime +3

и шаблон содержит символ * в качестве подстановочного знака.

Первая машина, похоже, расширила подстановочный символ и вызвала ошибку:

find /home/primbat/testing -name sftp_bcs_report_*.log -type f -ctime +7
find: paths must precede expression

и мне нужно либо сделать шаблон между двумя разделенными кавычками, например: \"sftp_bcs_report_*.log\"или использовать set -fв скрипте для подавления расширения подстановочных знаков.

В другой машине такой проблемы нет. Есть идеи?

решение1

По умолчанию оболочки расширяют подстановочные знаки, если файл соответствует им, но не расширяют их без соответствия. Например, если вы запустите touch /tmp/111; touch /tmp/11*это, то создадите и обновите mtime на /tmp/111, но если /tmp пуст, но вы вызовете, touch /tmp/11*то получите файл с именем "11*" в /tmp.

Это довольно странная особенность оболочек. Иногда правильное расширение невозможно без специальных хаков в качестве промежуточной функции. Большинство современных оболочек изобретают специальные опции для типичных случаев; например, "shopt -s failglob" в bash отклоняет запуск любой команды, где не удается выполнить подстановочное совпадение.

Следует полагаться на расширение подстановочных знаков find, поэтому такой шаблон должен быть заключен в кавычки при расширении в оболочке:

find /home/primbat/testing -name 'sftp_bcs_report_*.log' -type f -ctime +7

(обратите внимание на одинарные кавычки). С одним или нулевым файлом это работает, но с двумя или более файлами вы получаете нарушенный синтаксис команды, и он жалуется - вот что сказал коллегаАрсеж. Ваш "set -f" полностью отключает расширение - ну, это хорошая мера для диагностики, но может дать подводные грабли для будущего перемещения. Цитаты проще:)

решение2

Похоже, что в начальном каталоге на второй машине нет соответствующего файла sftp_bcs_report_*.log, а на первом сервере таких файлов больше одного. Для использования findшаблоны всегда следует заключать в кавычки.

Связанный контент