unix — вопросы с ответами

Операционная система Unix была создана более 30 лет назад группой исследователей из Bell Laboratories AT&T. В течение последующих трех десятилетий постоянного развития Unix нашел дом во многих местах, от повсеместного мэйнфрейма до домашних компьютеров и самых маленьких встроенных устройств.

В первые дни Unix был доступен в виде исходного кода, а не в типичной двоичной форме. Это помогло другим модифицировать код в соответствии с их потребностями, и это привело к появлению разветвлений в коде, что означает, что теперь существует много разнородных версий (Linux, macOS и др.).

Операционная система – это программный интерфейс между пользователем и оборудованием системы. Независимо от того, является ли ваша операционная система Unix, Linux или Windows, все, что вы делаете как пользователь или программист, так или иначе взаимодействует с оборудованием. Unix начинался как система интерфейса командной строки (CLI) – не было графического пользовательского интерфейса (GUI), чтобы сделать систему более удобной в использовании или более эстетичной. Теперь Unix имеет некоторые из наиболее настраиваемых доступных пользовательских интерфейсов, в том числе интерфейсы Mac OS X Aqua, Linux KDE и GNOME, что делает систему Unix по-настоящему готовой как для рабочего стола обычного пользователя, так и для рабочего места программиста.

Kernel, Shell и файловая система

Kernel – это ядро ​​операционной системы, без которого все остальное становится бессмысленным. Каждая отдельная операция, которую вы выполняете в операционной системе, должна косвенным образом выполняться ядром, которое также выполняет множество других задач (управление памятью, управление процессами, управление устройствами и управление вводом-выводом) в фоновом режиме.

Ядра Unix в прошлом были монолитными, но современные ядра являются модульными. Только важные, неотделимые возможности упаковываются в ядро, тогда как другие возможности компилируются как модули, которые можно загружать и выгружать во время выполнения. Взаимодействовать с ядром нелегко – ядро ​​еще не понимает английский язык и нуждается в специальных процедурах связи, известных как системные вызовы. Вот почему создатели Unix включили в операционную систему очень полезное приложение, известное как Shell (оболочка).

Shell (первоначально известная как Bourne shell) является интерпретатором команд. С одной стороны, она принимает от пользователя команды, набранные в производном подмножестве простого английского языка; а с другой стороны, она использует системные вызовы для связи с ядром, выполнения ваших команд и представления вам результатов. На сегодняшний день двумя наиболее широко используемыми оболочками являются bash (Bourne Again Shell) и zsh (Z Shell).

Это оставляет нам последний термин – файловая система. Вы уже наверняка когда-нибудь сталкивались с этим термином. Так что он значит? Файловая система – это логическое, иерархическое представление электронных данных в разделе диска. Каждая операционная система использует драйвер для файловой системы для чтения и/или записи в раздел. Наиболее распространенными типами файловых систем в Unix являются ext2 (Linux) и UFS (FreeBSD), хотя я должен отметить, что и Linux, и FreeBSD предлагают альтернативы: btrfs (Linux) и ZFS (FreeBSD). Кроме того, современные системы Unix могут легко получать доступ к данным и в не собственных файловых системах (таких как FAT и NTFS).

/dev/null

/dev/null похож на одну большую черную дыру, в которую вы можете закачать столько данных, сколько захотите. Сюда заходит что угодно, но ничего не возвращается. Другими словами, идеальный мусорный ящик.

Оболочка не выдаст "Hello World".

Стандартный ввод

Вот откуда берется весь ввод (input). Обычно здесь подразумевается клавиатура, но ее можно перенаправить из обычного файла на диске с помощью оператора <. Современные системы Unix имеют узел устройства /dev/stdin, который служит для представления стандартного ввода, который оболочка обозначает как безымянный файл с числовым идентификатором 0.

Таким образом, мы можем определить количество строк в файле /etc/fstab, используя одну из следующих команд:

или

Примечание: большинство команд Unix (например, wc, grep и sed), которые принимают файл в качестве аргумента командной строки, также принимают ввод, передаваемый через перенаправление оболочки или по каналу, и наоборот. Команда wc, показанная здесь, также может быть создана как wc -l /etc/fstab (т.е. без перенаправления).

Стандартный вывод

Для вывода данных обычно используется ваш монитор, но их можно перенаправить в обычный файл на диске с помощью оператора >. Современные системы Unix имеют узел устройства /dev/stdout, который служит для представления стандартного вывода, который оболочка обозначает как безымянный файл с числовым идентификатором 1.

Таким образом, мы можем получить список домашнего каталога с помощью:

Это отобразит список на мониторе ПК.

Примечание: перенаправление вывода в файл на диске с помощью > записывает вывод в новый файл. Если файл уже существует, он сначала будет обрезан до нулевой длины. Перенаправление с >> присоединяет к существующему файлу. Если файл еще не существует, он будет создан.

Shell Script

POSIX-совместимые скрипты интерпретируются оболочкой Bourne. Это делает их портативными по своей природе. Таким образом, хотя ваша интерактивная оболочка по понятным причинам будет Bash или Zsh, ваши сценарии должны быть закодированы для интерпретации с помощью sh (исполняемый файл оболочки Bourne).

Каждый сценарий оболочки начинается с открывающей строки, называемой shebang (шебанг), которая устанавливает путь к интерпретатору:

Эта строка разветвляет новый процесс оболочки, который выполняет операторы в сценарии. Скрипт без шебанга по-прежнему является действительным скриптом, но не может быть выполнен напрямую. Он может быть выполнен как часть другого скрипта или вызван как аргумент оболочки:

Последняя строка сценария shebang всегда одна и та же: exit 0. Все, кроме 0, подразумевает сбой. Без значения выхода статус возврата скрипта в оболочку не определен. Соглашение заключается в том, чтобы скрипт возвращал код завершения своей последней операции.

Существует многонациональное межкультурное соглашение о том, что все первоочередные программы должны выдавать Hello World. Мы создадим наш первый скрипт так, чтобы не нарушать традицию:

Арифметические и булевы операции

Начнем с полезного напоминания – переменные оболочки имеют только один тип, который является строкой типа.

Несмотря на внешний вид, v3 и v4 являются строковыми переменными. Поскольку содержимое v3 является чисто числовым, мы можем выполнить некоторые основные внешние арифметические операции с ним, используя expr:

Поскольку использование expr является трудоемким, помимо внешней команды, есть отличный способ выполнить эту арифметическую операцию внутри оболочки:

Несмотря на то, что оболочка способна выполнять арифметические операции на v3, v3 специально не обрабатывается оболочкой. Как и все другие переменные оболочки, v3 хранится в виде строки, и арифметические функции, такие как expr, должны сначала убедиться, что операнд является числовым.

Булевы значения, если вы не знаете, являются истинными/ложными условиями. К счастью или к сожалению, в мире оболочек логические переменные не существуют. Если вы присваиваете значение переменной оболочки (как мы это сделали для v4), переменная оболочки просто остается строкой с содержимым t, после которой следует r, затем u и e.

Вместо true/false вы можете использовать любую другую комбинацию, которая вам нравится: on или off, YES или NO и 1 или 0.

Системное администрирование

Было время, когда администрирование Unix считалось священной задачей, открытой только для супер-экспертов, чьи зарплаты были источником большой зависти. С началом революции GNU это благополучно перешло в ситуацию, когда администрирование рабочего стола Unix требует меньших накладных расходов, чем Windows, которая все еще использует устаревший цикл поиска-загрузки-установки-настройки для каждого небольшого изменения в системе.

Администрирование сервера Unix (для размещения таких служб, как почта, брандмауэр и DNS) по-прежнему требует немалых знаний, опыта и готовности работать.

Root

Под FreeBSD вы можете быть пользователем root всякий раз, когда вам нужно. Под Linux такая возможность будет не всегда (команды в этой главе предполагают наличие учетных данных root, если не указано иное).

Первое, на что вы должны быть уверены в Linux, это то, что вы можете переключиться на учетную запись суперпользователя (root):

Дистрибутивы с Ubuntu побуждают пользователя не переключаться на учетную запись root и использовать вместо этого sudo. Системный установщик автоматически получает привилегии sudo. Поэтому для запуска любой команды от имени root просто введите команду в качестве аргумента для sudo. Чтобы фактически переключиться на учетную запись пользователя root, сначала необходимо установить пароль пользователя root:

Если вы используете только что установленную версию Linux, обновите систему, чтобы получить все важные исправления, выпущенные после выпуска программы установки:

Локальные файловые системы

В большинстве случаев единственной смонтированной файловой системой после новой установки является /filesystem. Вы должны записать (и затем запомнить) узел устройства, который монтируется как /.

Linux по умолчанию использует UUID для обозначения файловых систем в /etc/fstab. Это имеет незначительные преимущества и большие недостатки. Традиционная номенклатура узлов устройства более прозрачна и легко запоминается – вы все равно не хотите / загружаться через динамические ссылки. Представьте, что вам нужно выполнить проверку согласованности файловой системы с помощью fsck и без каких-либо приятных воспоминаний об узле устройства для /.

Если на вашем жестком диске есть какие-либо разделы (кроме /), к которым вам нужно получить доступ, создайте каталог точки монтирования, обычно в /mnt, и добавьте запись в /etc/fstab. Например, предположим, у вас есть логический диск (отформатированный как Ext2) в расширенном разделе.

Вы можете смонтировать его с помощью следующей записи в /etc/fstab:

С помощью этой строки вы теперь можете смонтировать файловую систему ada0s5 (FreeBSD)/sda5 (Linux) с помощью команды mount/mnt/ext2.

21 ответ
Я обновляю nginx до 1.4.7 и php до 5.5.12. После этого я получил 502 ошибку. Перед тем, как обновить, все будет хорошо. Nginx-error.log 2014/05/03 13:27:41 [crit] 4202#0: *1 connect() to unix:/var/run/php5-fpm.sock failed (13: Permission denied) while connecting to upstream, client: xx.xxx.xx.xx,...
nginx
03 май 2014, в 11:48
9 ответов
Я только нашел, как ждать ввода пользователя. Тем не менее, я только хочу сделать паузу, чтобы мой while true не разбивал мой компьютер. Я попробовал pause(1), но он говорит -bash: syntax error near unexpected token '1'. Как это можно сделать?
terminal
07 фев. 2014, в 06:04
24 ответа
Я пытаюсь добавить каталог на свой путь, поэтому он всегда будет на моем пути Linux. Я пробовал: export PATH=$PATH:/path/to/dir Это работает, однако каждый раз, когда я выхожу из терминала и запускаю новый экземпляр терминала, этот путь теряется, и мне нужно снова запустить команду экспорта. Как я ...
zsh
path
31 янв. 2013, в 22:59
15 ответов
Я хочу написать script, который будет проходить через 15 строк (возможно, массив)? Возможно ли это? Что-то вроде: for databaseName in listOfNames then # Do something end
arrays
16 янв. 2012, в 12:40
6 ответов
Я пытаюсь использовать cURL в script и получить его не, показывая индикатор выполнения. Я пробовал опции -s, -silent, -s и -quiet, но никто из них не работает. Вот типичная команда, которую я пробовал: curl -s http://google.com > temp.html Я только получаю индикатор выполнения при нажатии его в...
curl
scripting
10 сен. 2011, в 19:43
19 ответов
Есть ли "канонический" способ сделать это? Я использую head -n | tail -1, который делает трюк, но мне было интересно, есть ли инструмент Bash, который специально извлекает строку (или диапазон строк) из файла. Под "каноническим" подразумевается программа, основная функция которой выполняется....
awk
sed
16 май 2011, в 21:09
11 ответов
При написании программ оболочки мы часто используем /bin/sh и /bin/bash. Обычно я использую bash, но я не знаю, какая разница между ними. Какое основное различие между bash и sh? Что нам нужно знать при программировании в bash и sh?
20 апр. 2011, в 04:11
13 ответов
Я хотел бы запустить поиск и заменить файл HTML через командную строку. Моя команда выглядит примерно так: sed -e s/STRING_TO_REPLACE/STRING_TO_REPLACE_IT/g index.html > index.html Когда я запустил это и посмотрел на файл после этого, он пуст. Он удалил содержимое моего файла. Когда я запустил э...
02 март 2011, в 19:05
8 ответов
Если я хочу найти различия между двумя деревьями каталогов, я обычно просто выполняю: diff -r dir1/ dir2/ Это точно определяет различия между соответствующими файлами. Мне интересно только получить список соответствующих файлов, содержимое которых отличается. Я предположил, что это просто вопрос пе...
14 фев. 2011, в 22:01
28 ответов
В PHP строки объединяются следующим образом: $foo = "Hello"; $foo .= " World"; Здесь $foo становится "Hello World". Как это достигается в Bash?
append
syntax
concat
string-concatenation
15 нояб. 2010, в 05:04
11 ответов
Как мне перебрать каждую строку текстового файла с помощью Bash? С помощью этого скрипта: echo "Start!" for p in (peptides.txt) do echo "${p}" done Я получаю этот вывод на экране: Start! ./runPep.sh: line 3: syntax error near unexpected token '(' ./runPep.sh: line 3: 'for p in (peptides.txt)...
loops
io
05 окт. 2009, в 17:04
16 ответов
В оболочке Unix, если я хочу объединить stderr и stdout в поток stdout для дальнейшей обработки, я могу добавить следующее в конце моей команды: 2>&1 Итак, если я хочу использовать "head" на выходе из g++, я могу сделать что-то вроде этого: g++ lots_of_errors 2>&1 | head поэтому я в...
redirect
04 май 2009, в 00:14
5 ответов
Я знаю это, забудьте об этом и снова заново зачитайте его. Время записать его.
09 апр. 2009, в 12:27
25 ответов
У меня есть приложение на С++, работающее на Linux, которое я в процессе оптимизации. Как я могу определить, какие области моего кода работают медленно?
profiling
17 дек. 2008, в 20:56
15 ответов
Существует этот пример кода, но затем он начинает говорить о проблемах с миллисекундами/наносекундами. Тот же вопрос относится к MSDN, Секунды с эпохи Unix в С#. Это то, что у меня есть до сих пор: public Double CreatedEpoch { get { DateTime epoch = new DateTime(1970, 1, 1, 0, 0, 0, 0).ToLoc...
datetime
data-conversion
epoch
30 окт. 2008, в 11:20
Наверх
Меню