Наша взаимовыгодная связь https://banwar.org/
Команди, які не можна віднести ні до однієї з перерахованих вище категорій
jot, seqЦі утиліти виводять послідовність цілих чисел з кроком, заданим користувачем.
За замовчуванням, що виводяться числа відокремлюються один від одного символом переведення рядка, однак, за допомогою ключа -s може бути заданий інший роздільник.
bash $ seq 5 1 2 3 4 5 bash $ seq -s: 5 1: 2: 3: 4: 5Обидві утиліти, і jot, і seq, дуже зручно використовувати для генерації списку аргументів в циклі for .
Приклад 12-39. Використання seq для генерації списку аргументів циклу for
#! / Bin / bash # Утиліта "seq" echo for a in `seq 80` # або так: for a in $ (seq 80) # Те ж саме, що і for a in 1 2 3 4 5 ... 80 (але як економить час і сили!). # Можна використовувати і 'jot' (якщо ця утиліта є в системі). do echo -n "$ a" done # 1 2 3 4 5 ... 80 # Приклад використання виведення команди для генерації # [списку] аргументів циклу "for". echo; echo COUNT = 80 # Так, 'seq' допускає вказівку змінних як параметр. for a in `seq $ COUNT` # або так: for a in $ (seq $ COUNT) do echo -n" $ a "done # 1 2 3 4 5 ... 80 echo; echo BEGIN = 75 END = 80 for a in `seq $ BEGIN $ END` # Якщо" seq "передаються два аргументи, то перший означає початкове число послідовності, # + другий - останнє, do echo -n" $ a "done # 75 76 77 78 79 80 echo; echo BEGIN = 45 INTERVAL = 5 END = 80 for a in `seq $ BEGIN $ INTERVAL $ END` # Якщо" seq "передет три аргументи, то перший аргумент - початкова число в послідовності, # + другий - крок послідовності, # + і третій - останнє число в послідовності. do echo -n "$ a" done # 45 50 55 60 65 70 75 80 echo; echo exit 0 getoptКоманда getopt служить для розбору командного рядка, виділяючи з неї ключі - символи, з попереднім знаком дефіс . Цією утиліті є, вбудований в Bash, аналог - getopts , Більш потужна і універсальна команда.
Приклад 12-40. Використання getopt для розбору аргументів командного рядка
#! / Bin / bash # ex33a.sh # Спробуйте наступні варіанти виклику цього сценарію. # Sh ex33a -a # sh ex33a -abc # sh ex33a -a -b -c # sh ex33a -d # sh ex33a -dXYZ # sh ex33a -d XYZ # sh ex33a -abcd # sh ex33a -abcdZ # sh ex33a -z # sh ex33a a # Поясніть отримані результати. E_OPTERR = 65 if [ "$ #" -eq 0] then # Необхідний щонайменше один аргумент. echo "Порядок використання: $ 0 - [options a, b, c]" exit $ E_OPTERR fi set - `getopt" abcd: "" $ @ " '# Запис аргументів командного рядка в позиційні параметри. # Що станеться, якщо замість "$ @" вказати "$ *"? while [! -z "$ 1"] do case "$ 1" in -a) echo "Опція \" a \ "" ;; -b) echo "Опція \" b \ "" ;; -c) echo "Опція \" c \ "" ;; -d) echo "Опція \" d \ "$ 2" ;; *) Break ;; esac shift done # Замість 'getopt' краще використовувати вбудовану команду 'getopts', # Див. "ex33.sh". exit 0 run-partsКоманда run-parts запускає на виконання всі сценарії, в порядку зростання імен файлів-сценаріїв, в заданому каталозі. Природно, файли сценаріїв повинні мати права на виконання.
демон crond викликає run-parts для запуску сценаріїв з каталогів /etc/cron.*.
yesЗа замовчуванням, команда yes виводить на stdout безперервну послідовність символів y, розділених символами переведення рядка. Виконання команди можна перервати комбінацією клавіш control - c. Команду yes можна змусити виводити іншу послідовність символів. Тепер саме час запитати себе про практичну користь цієї команди. Основне застосування цієї команди полягає в тому, що висновок від неї може бути переданий, через конвеєр, іншій команді, яка чекає на реакції користувача. В результаті виходить, свого роду, слабенька версія команди expect.
yes | fsck / dev / hda1 запускає fsck в неінтерактивному режимі (будьте обережні!).
yes | rm -r dirname має той же ефект, що і rm -rf dirname (будьте обережні!).

Увага! Передача виведення команди yes по конвеєру потенційно небезпечним командам, таким як fsck або fdisk може дати небажані побічні ефекти.
bannerДрукує на stdout задану рядок символів (не більше 10), малюючи кожен символ рядка за допомогою символу '#'. Висновок від команди може бути перенаправлений на принтер.
printenvвиводить всі змінні оточення поточного користувача.
bash $ printenv | grep HOME HOME = / home / bozolp
Команди lp і lpr відправляють файли в чергу друку для виведення на принтер. Назви цих команд походять від "line printers".
bash $ lp file1.txt або bash lp <file1.txt
Дуже часто використовуються в комбінації з командою форматированного виведення pr.
bash $ pr -options file1.txt | lp
Програми підготовки тексту до друку, такі як groff і Ghostscript, так само можуть безпосередньо взаємодіяти з lp.
bash $ groff -Tascii file.tr | lp
bash $ gs -options | lp file.ps
Команда lpq яка дає змогу відтворювати черги завдань друку, а lprm - для видалення завдань з черги.
tee[UNIX запозичив цю ідею з водопровідного справи.]
Це Опрератор перенаправлення, але з деякими особливостями. Подібно водопровідних труб, дозволяє даних в кілька файлів і на stdout одночасно, ніяк не впливаючи на самі дані. Ця команда може виявитися дуже корисною при налагодженні.
tee | ------> в файл | =============== | =============== command ---> ---- | -operator -> ---> результат роботи команд (и) =============================== cat listfile * | sort | tee check.file | uniq> result.file (Тут, в файл check.file будуть записані дані з усіх, в відсортованому вигляді до того, як повторювані рядки будуть видалені командою uniq .)mkfifo
Ця, рідко зустрічається, команда створює іменований канал - черга, через який проводиться обмін даними між процесами. Як правило, один процес записує дані в чергу (FIFO), а інший читає дані з черги. Див. Приклад A-17 .
pathchkРобить перевірку повного імені файлу - перевіряє, чи доступні на читання, каталоги в шляху до файлу, і чи не перевищує довжина повного імені файлу 255 символів. При недотриманні однієї з умов - повертає повідомлення про помилку.
На жаль, pathchk не повертає відповідного коду помилки, і тому, в общем-то, марна в сценаріях. Замість неї краще використовувати оператори перевірки файлів .
ddЦя трохи незрозуміла і "страшна" команда () спочатку використовувалася для перенесення даних на магнітній стрічці між мікрокомп'ютерами з ОС UNIX і майнфреймів IBM. Команда dd просто створює копію файлу (або stdin / stdout), виконуючи по шляху деякі перетворення. Один з варіантів: перетворення з ASCII в EBCDIC, dd --help виведе список можливих варіантів перетворень і опцій цієї потужної утиліти.
# Вивчаємо 'dd'. n = 3 p = 5 input_file = project.txt output_file = log.txt dd if = $ input_file of = $ output_file bs = 1 skip = $ ((n-1)) count = $ ((p-n + 1)) 2> / dev / null # одержить від $ input_file символи з n-го по p-й. echo -n "hello world" | dd cbs = 1 conv = unblock 2> / dev / null # Виведе "hello world" вертикально. # Спасибі, SCДля демонстрації можливостей dd, спробуємо перехопити натискання на клавіші.
Приклад 12-41. Захоплення натиснутих клавіш
#! / Bin / bash # Захоплення натиснутих клавіш. keypresses = 4 # Кількість фіксованих натискань. old_tty_setting = $ (stty -g) # Зберегти настройки терміналу. echo "Натисніть $ keypresses клавіші." stty -icanon -echo # Заборонити канонічний режим. # Заборонити луна-висновок. keys = $ (dd bs = 1 count = $ keypresses 2> / dev / null) # 'dd' використовує stdin, якщо "if" не заданий. stty "$ old_tty_setting" # Відновити настройки терміналу. echo "Ви натиснули клавіші \" $ keys \ "." # Спасибі SC exit 0Команда dd має можливість довільного доступу до даних в потоці.
echo -n. | dd bs = 1 seek = 4 of = file conv = notrunc # Тут, опція "conv = notrunc" означає, що вихідний файлне буде усічений. # Спасибі, SCКоманда dd може використовуватися для створення образів дисків, зчитуючи дані прямо з пристроїв, таких як дискети, компакт диски, магнітні стрічки ( Приклад A-6 ). Зазвичай вона використовується для створення завантажувальних дискет.
dd if = kernel-image of = / dev / fd0H1440
Точно так же, dd може скопіювати весь вміст дискети, навіть з невідомої файлової системою, на жорсткий диск у вигляді файлу-образу.
dd if = / dev / fd0 of = / home / bozo / projects / floppy.img
Ще одне застосування dd - створення тимчасового swap-файлу ( приклад 28-2 ) І ram-дисків ( приклад 28-3 ). Вона може створювати навіть образи цілих розділів жорсткого диска, хоча і не рекомендується робити це без особливої на то потреби.
Багато (які, ймовірно, не знають чим себе зайняти) постійно придумують все нові і нові області застосування команди dd.
Приклад 12-42. Надійне видалення файлу
#! / Bin / bash # blotout.sh: Надійно видаляє файл. # Цей суенарій записує випадкові дані в заданий файл, # + потім записує туди нулі і нарешті видаляє файл. # Після такого видалення навіть аналіз дискових секторів # + не дасть рівним рахунком нічого. PASSES = 7 # Кількість проходів по файлу. BLOCKSIZE = 1 # операції введення / виводу в / з / dev / urandom вимагають вказівки розміру блоку, # + інакше ви не отримаєте бажаного результату. E_BADARGS = 70 E_NOT_FOUND = 71 E_CHANGED_MIND = 72 if [-z "$ 1"] # Файл не вказано. then echo "Порядок використання:` basename $ 0` filename "exit $ E_BADARGS fi file = $ 1 if [! -e "$ file"] then echo "Файл \" $ file \ "не найден." exit $ E_NOT_FOUND fi echo; echo -n "Ви абсолютно впевнені в тому, що бажаєте знищити \" $ file \ "(y / n)?" read answer case "$ answer" in [nN]) echo "Передумали? Операцію скасовано." exit $ E_CHANGED_MIND ;; *) Echo "Знищується файл \" $ file \ "." ;; esac flength = $ (ls -l "$ file" | awk '{print $ 5}') # Поле з номером 5 - це довжина файлу. pass_count = 1 echo while [ "$ pass_count" -le "$ PASSES"] do echo "Прохід # $ pass_count" sync # Виштовхнути буфери. dd if = / dev / urandom of = $ file bs = $ BLOCKSIZE count = $ flength # Заповнити файл випадковими даними. sync # Знову виштовхнути буфери. dd if = / dev / zero of = $ file bs = $ BLOCKSIZE count = $ flength # Заповнити файл нулями. sync # Знову виштовхнути буфери. let "pass_count + = 1" echo done rm -f $ file # Нарешті видалити неабияк "зіпсований" файл. sync # Виштовхнути буфери в останній раз. echo "Файл \" $ file \ "знищений."; echo # Це досить надійний, хоча і досить повільний спосіб знищення файлів. # + Ефективніше це робить команда "shred", # + входить до складу пакету GNU "fileutils". # Знищений таким чином файл, не зможе бути відновлений звичайними методами. # Однак ... # + ця метода ймовірно НЕ зможе протистояти аналітичним службам # + з ВІДПОВІДНИХ ОРГАНІВ # Tom Vier розробив пакет "wipe", який більш надійно стирає файли # + ніж цей простий сценарій. # Http://www.ibiblio.org/pub/Linux/utils/file/wipe-2.0.0.tar.bz2 # Для більш глибоко вивчення проблеми надійного видалення файлів, # + рекомендую звернутися до cnfnmt Peter Gutmann, # + " Secure Deletion of Data From Magnetic and Solid-State Memory ". # Http://www.cs.auckland.ac.nz/~pgut001/pubs/secure_del.html exit 0 odКоманда od (octal dump) виробляє перетворення введення (або файла) в один або декілька форматів, відповідно до зазначених опціями. При відсутності опцій використовується восьмеричний формат (опція -o). Ця команда корисна при перегляді або обробці файлів з двійковими даними, наприклад / dev / urandom. Див. приклад 9-26 і приклад 12-10 .
hexdumpВиводить дамп двійкових даних з файлу в вісімковому, шестнадцатиричном, десятковому вигляді або у вигляді ASCII. Цю команду, з масою застережень, можна назвати еквівалентом команди of od.
objdumpПоказує вміст виконуваного або об'єктного файлу або в шістнадцятковій формі, або у вигляді дізассемблерного лістингу (з ключем -d).
bash $ objdump -d / bin / ls / bin / ls: file format elf32-i386 Disassembly of section .init: 080490bc <.init>: 80490bc: 55 push% ebp 80490bd: 89 e5 mov% esp,% ebp. . .mcookie
Ця команда створює псевдовипадкові шістнадцяткові 128-бітові числа, так звані, зазвичай використовується X-сервером в якості авторизації. У сценаріях може використовуватися як малоефективний генератор випадкових чисел.
random000 = `mcookie | sed -e '2p'` #' sed 'видаляє сторонні символи.Звичайно, для тих же цілей, сценарій може використовувати md5 .
# Сценарій обчислює контрольну суму для самого себе. random001 = `md5sum $ 0 | awk '{print $ 1}' '#' awk 'видаляє ім'я файлу.За допомогою mcookie можна створювати імена файлів.
Приклад 12-43. Генератор імен файлів
#! / Bin / bash # tempfile-name.sh: Генератор імен тимчасових файлів BASE_STR = `mcookie` # 32-символьний (128 біт) magic cookie. POS = 11 # Довільна позиція в рядку magic cookie. LEN = 5 # $ LEN послідовних символів. prefix = temp # Зрештою це тимчасовий ( "temp") файл. suffix = $ {BASE_STR: POS: LEN} # Витягти рядок, довжиною в 5 символів, починаючи з позиції 11. temp_filename = $ prefix. $ suffix # Збірка імені файлу. echo "Ім'я тимчасового файлу = \" $ temp_filename \ "" # sh tempfile-name.sh # Ім'я тимчасового файлу = temp.e19ea exit 0 unitsЦя утиліта виробляє перетворення величин з одних одиниць вимірювання в інші. Як правило викликається в інтерактивному режимі, нижче наводиться приклад використання units в сценарії.
Приклад 12-44. Перетворення метрів в милі
#! / Bin / bash # unit-conversion.sh convert_units () # Приймає в якості вхідних параметрів одиниці виміру. {Cf = $ (units "$ 1" "$ 2" | sed --silent -e '1p' | awk '{print $ 2}') # Видаляє всі крім коефіцієнтів перетворення. echo "$ cf"} Unit1 = miles Unit2 = meters cfactor = `convert_units $ Unit1 $ Unit2` quantity = 3.73 result = $ (echo $ quantity * $ cfactor | bc) echo" В $ quantity милях $ result метрів. " # Що станеться, якщо в функцію передати несумісні одиниці виміру, # + наприклад "acres" (акри) and "miles" (милі)? exit 0 m4Чи не команда, а скарб, m4 - це потужний фільтр обробки макроозначень, фактично - цілий мова програмування. Спочатку створювалася як препроцесор для RatFor, m4 виявилася дуже корисною і як самостійна утиліта. Фактично, m4 поєднує в собі функціональні можливості eval , tr , awk , І додатково надає великі можливості по створенню нових макроозначень.
У квітневому випуску, за 2002 рік, журналу Linux Journal ви знайдете чудову статтю, що описує можливості утиліти m4.
Приклад 12-45. Приклад роботи з m4
#! / Bin / bash # m4.sh: Демонстрація деяких возможнос макропроцесора m4 # Рядки string = abcdA01 echo "len ($ string)" | m4 # 7 echo "substr ($ string, 4)" | m4 # A01 echo "regexp ($ string, [0-1] [0-1], \ & Z)" | m4 # 01Z # Арифметика echo "incr (22)" | m4 # 23 echo "eval (99/3)" | m4 # 33 exit 0 doexecКоманда doexec надає можливість передачі довільного списку аргументів зовнішній програмі. Зокрема, передаючи argv [0] (для сценаріїв відповідає спеціальної змінної $ 0 ), Можна викликати програму під іншим ім'ям, визначаючи тим самим, її реакцію.
Наприклад, Нехай в каталозі / usr / local / bin є програма з ім'ям, яка при виклику doexec / usr / local / bin / aaa list виведе список всіх файлів в поточному каталозі, імена яких починаються з символу, а при виклику тієї ж самої програми як doexec / usr / local / bin / aaa delete, вона видалить ці файли.

Природно, реакція програми на своє власне ім'я має бути реалізована в коді програми, для сценарію на мові командної оболонки це може виглядати приблизно так:
case `basename $ 0` in" name1 ") реакція на виклик під ім'ям name1 ;; "Name2") реакція на виклик під ім'ям name2 ;; "Name3") реакція на виклик під ім'ям name3 ;; *) Дії за замовчуванням ;; esacЩо станеться, якщо замість "$ @" вказати "$ *"?
Quot; exit $ E_NOT_FOUND fi echo; echo -n "Ви абсолютно впевнені в тому, що бажаєте знищити \" $ file \ "(y / n)?
Quot; read answer case "$ answer" in [nN]) echo "Передумали?
Quot; # Що станеться, якщо в функцію передати несумісні одиниці виміру, # + наприклад "acres" (акри) and "miles" (милі)?