Спеціальні символи і їх екранування
Ряд символів в командах є спеціальними символами. Це означає, що вони не передаються запускається програмою або оброблювачу внутрішньої команди shell'а, а обробляються ДО ТОГО, як команда буде виконана. Тобто спеціальні символи керують самим shell'ом. У число таких символів входять:
Якщо ви хочете, щоб shell не обробляються по-особливому спеціальний символ, а обробляв його як звичайний символ, то його потрібно екранувати. Є три способи це зробити:
1. Поставити зворотний слеш (\) перед спеціальним символом (по-англійськи цей метод називається escape). Сам зворотний слеш, відповідно, теж є спеціальним символом, і його можна так само екранувати (тобто поставити два слеша: \\). наприклад:
grep lucky \ * star my \ file # Шукаємо рядок lucky * star в файлі my file
Зворотний слеш перед звичайним, що не спеціальним символом буде просто проігноровано.
2. Укласти команду або частина команди зі спеціальними символами в подвійні лапки ( "). По-англійськи цей метод називається quote. Подвійні лапки екранують більшість спеціальних символів, але не всі. Решта спец. Символи усередині подвійних лапок можна екранувати зворотним слешем. Приклад:
grep "lucky * star" "my file" # Аналогічно попередній команді
Зворотний слеш всередині подвійних лапок перед звичайним символом або символом, який і без нього екранується в подвійних лапках, буде оброблений як екранований слеш. Але його можна і експліцитно екранувати. Це означає, що команди echo "hello, \ slash" і echo "hello, \\ slash" виведуть на екран одне і те ж: hello, \ slash.
3. Укласти команду або частина команди в одинарні лапки (по-англійськи цей метод теж називається quote). Вони екранують все спеціальні символи. приклад:
# Знайти рядок $ 1000 в файлі my income
grep '$ 1000.' "my income"
# Символ '$ "не екранується подвійними лапками, а одинарними - екранується.
Зворотний слеш всередині подвійних лапок завжди вважається екранованим. Команда echo 'hello, \\ slash' виведе на екран hello, \\ slash.
Висновок результату роботи в файл
Швидше за все, вам коли-небудь доведеться записати весь висновок команди в файл. Зробити це просто: команда> ім'я файлу
# Знайти всі рядки, що містять підрядок "loruser" у файлі / etc / passwd
# І записати їх у файл "myfile" в директорії "Документи" в домашній директорії.
grep loruser / etc / passwd>
При цьому врахуйте, що кожна програма має два потоку виведення: стандартний потік виведення і потік помилок. Програма сама визначає, які повідомлення в який потік виводити. Якщо ви перенаправити тільки потік виведення, то помилки не будуть записані в файл, а будуть показані на екрані (і навпаки). Для перенаправлення потоку помилок використовуйте такий синтаксис: команда 2> ім'я файлу
Можна направити в файли обидва потоку:
команда> файл_для_вивода 2> файл_для_ошібок
grep loruser / etc / passwd>
При перенаправлення виведення або помилок в файл файл буде повністю перезаписаний (або створений, якщо його немає). Навіть якщо нічого не буде виведено, файл буде перезаписаний і замінений порожнім.
Щоб дописати висновок в кінець файлу, зберігши попередній вміст, використовуйте подвійний знак "більше" замість одинарного. Тобто:
команда >> файл # Для виведення
команда 2 >> файл # Для помилок
Можливо, у вас виникне й інше питання: як змусити програму вважати дані з файлу, як якщо б їх вводили за допомогою клавіатури?
Але якщо ви впевнені, що такої функції немає, ви все ж можете направити дані з файлу в потік введення програми:
Так, можна комбінувати перенаправлення вводу і виводу:
команда <файл_для_ввода> файл_для_вивода
Особливим варіантом перенаправлення виведення є організація програмного каналу (конвеєра). Для цього дві або кілька команд, таких, що висновок попередньої служить введенням для наступної, з'єднуються (або розділяються, якщо вам це більше подобається) символом вертикальної риски - "|". При цьому стандартний вихідний потік команди, розташованої зліва від символу |, прямує на стандартне введення програми, розташованої праворуч від символу |.
Треба відзначити, що оболонка одночасно викликає на виконання все команди, включені в конвеєр, запускаючи для кожної з команд окремий екземпляр оболонки, так що як тільки перша програма починає щось видавати в свій вихідний потік, наступна команда починає його обробляти. Точно так же кожна наступна команда виконує свою операцію, чекаючи даних від попередньої команди і видаючи свої результати на вхід наступної. Якщо ви хочете, щоб якась команда повністю завершилася до початку виконання наступної, ви можете використовувати в одному рядку як символ конвеєра |, так і крапку з комою;. Перед кожною крапкою з комою оболонка буде зупинятися і чекати, поки завершиться виконання всіх попередніх команд, включених в конвеєр.
Фільтри - це команди (або програми), які сприймають вхідний потік даних, виробляють над ним деякі перетворення і видають результат на стандартний висновок (звідки його можна перенаправити кудись ще за бажанням користувача). До числа команд-фільтрів відносяться команди cat, more, less, wc, cmp, diff, а також наступні команди.
Таблиця 5.1. Команди-фільтри