<Попередній | зміст | Наступна>
Оператори
Навіть з усіма такими тестами знаходити надає, можливо, нам все одно знадобиться кращий спосіб описати логічні відносини між тестами. Наприклад, що, якщо нам потрібно визначити, чи всі файли та підкаталоги в каталозі мають безпечні дозволи? Ми будемо шукати всі файли з дозволами, які не є 0600, і каталоги з дозволами, які не є 0700. На щастя, знаходити надає спосіб комбінувати тести за допомогою логічні оператори
створювати складніші логічні зв’язки. Щоб виразити вищезгаданий тест, ми можемо зробити це:
[me@linuxbox ~]$ знайти ~ \( -тип f -не -перм 0600 \) -або \( -тип d
-не -perm 0700 \)
[me@linuxbox ~]$ знайти ~ \( -тип f -не -перм 0600 \) -або \( -тип d
-не -perm 0700 \)
Ой! Це, звичайно, виглядає дивно. Що це за все? Насправді, оператори не такі вже й складні, коли з ними познайомишся. Ось список:
Таблиця 17-4: знайти логічні оператори
Опис оператора
Опис оператора
-і Знайдіть відповідність, якщо тести з обох сторін оператора істинні. Може бути скорочено до -a. Зауважте, що коли оператор відсутній, -і мається на увазі за замовчуванням.
-Або Знайдіть відповідність, якщо тест з обох боків оператора істинний. Може бути скорочено до -o.
-немаєt Знайдіть відповідність, якщо тест після оператора хибний. Може бути скорочено зі знаком оклику (!).
() Групує тести та оператори разом, щоб утворити більші вирази. Це використовується для контролю пріоритету логічних оцінок. За замовчуванням, знаходити оцінює зліва направо. Часто для отримання бажаного результату необхідно змінити порядок оцінки за замовчуванням. Навіть якщо це не потрібно, іноді корисно включати символи групування, щоб покращити читабельність команди. Зауважте, що, оскільки символи круглих дужок мають особливе значення для оболонки, їх потрібно вводити в лапки під час використання їх у командному рядку, щоб дозволити передавати їх як аргументи до знаходити. Зазвичай для їх екранування використовується символ зворотної косої риски.
Маючи в руках цей список операторів, давайте розбудуємо наш знаходити команда. Якщо дивитися з самого верхнього рівня, ми бачимо, що наші тести розташовані у вигляді двох груп, розділених символом -Або оператор:
( вираз 1 ) -або ( вираз 2 )
Це має сенс, оскільки ми шукаємо файли з певним набором дозволів і каталоги з іншим набором. Якщо ми шукаємо і файли, і каталоги, навіщо
ми використовуємо -Або замість -і? Тому що як знаходити сканує файли та каталоги, кожен з яких оцінюється, щоб перевірити, чи відповідає він зазначеним тестам. Ми хочемо знати, чи це так будь-який файл з поганими дозволами or каталог з поганими дозволами. Не може бути обидва одночасно. Отже, якщо ми розширимо згруповані вирази, ми побачимо це таким чином:
(файл із поганою завивкою) -або (каталог із поганою завивкою)
Наше наступне завдання полягає в тому, як перевірити на наявність «поганих дозволів». Як ми це робимо? Насправді ми ні. Те, що ми перевіримо, — це «погані дозволи», оскільки ми знаємо, що таке «хороші дозволи». У випадку файлів ми визначаємо good як 0600, а для каталогів — як 0700. Вираз, який перевірятиме файли на «неякісні» дозволи:
-тип f -і -не -perms 0600
і для каталогів:
-тип d -і -не -perms 0700
Як зазначено в таблиці операторів вище, the -і оператор можна безпечно видалити, оскільки він мається на увазі за замовчуванням. Отже, якщо ми повернемо все це разом, ми отримаємо останню команду:
знайти ~ ( -type f -not -perms 0600 ) -або ( -type d -not
-завивка 0700 )
Однак, оскільки дужки мають особливе значення для оболонки, ми повинні уникнути їх, щоб оболонка не намагалася їх інтерпретувати. Перед кожним із символів зворотної косої риски робить трюк.
Є ще одна особливість логічних операторів, яку важливо зрозуміти. Скажімо, у нас є два вирази, розділені логічним оператором:
вираз 1 -оператор вираз 2
У всіх випадках вираз 1 завжди буде виконуватися; однак, оператор визначить, чи
виконується expr2. Ось як це працює:
Таблиця 17-5: знайти логіку І/АБО
Результати вираз 1 | Оператор | вираз 2 це ... |
Правда | -і | Завжди виконується |
Помилковий | -і | Ніколи не виконували |
Правда | -Або | Ніколи не виконували |
Помилковий | -Або | Завжди виконується |
Чому це відбувається? Це зроблено для підвищення продуктивності. Приймати -і, наприклад. Ми знаємо, що вираз вираз 1 -і вираз 2 не може бути істинним, якщо результат вираз 1 is
false, тому немає сенсу виконувати expr2. Аналогічно, якщо у нас є вираз expr1 -Або expr2 і результат expr1 є істинним, немає сенсу виконувати expr2, як ми вже знаємо, що вираз expr1 -Або вираз2 вірне.
Добре, це допомагає швидше. Чому це важливо? Це важливо, оскільки ми можемо покладатися на цю поведінку, щоб контролювати виконання дій, як ми незабаром побачимо.