Ifs linux что это

Обновлено: 04.07.2024

В начале сценария оболочки bash находится следующая строка:

В чем смысл этой коллекции символов?

IFS расшифровывается как «внутренний разделитель полей». Он используется оболочкой для определения того, как выполнять разбиение слов, то есть как распознавать границы слов.

Попробуйте это в оболочке, такой как bash (другие оболочки могут обрабатывать это по-разному, например, zsh):

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

Другими словами, оболочка считает, что пробел является границей слова.

Теперь попробуйте установить IFS=: перед выполнением цикла. На этот раз результат:

Теперь оболочка также разбивается mystring на слова - но теперь она рассматривает только двоеточие как границу слова.

Первый символ IFS - специальный: он используется для разделения слов в выводе при использовании специальной $* переменной (пример взят из Руководства по расширенному написанию сценариев Bash , где вы также можете найти дополнительную информацию о специальных переменных, подобных этой):

Обратите внимание , что в обоих примерах, оболочка будет по- прежнему относиться все символы : , - а ; также границы слов. Единственное, что меняется, это поведение $* .

Еще одна важная вещь, которую нужно знать, это то, как обрабатываются так называемые «пробелы IFS» . По сути, как только IFS включаются пробельные символы, начальные и конечные пробельные символы удаляются из строки, которая должна быть разделена перед обработкой, а также последовательность последовательных пробельных символов также разделяет поля. Однако это относится только к тем пробельным символам, которые фактически присутствуют в IFS .

Например, давайте посмотрим на строку "a:b:: c d " (завершающий пробел и два пробела между символами c и d ).

  1. С IFS=: он будет разделен на четыре поля: "a" , "b" , "" (пустая строка) и " c d " (опять же , два пространства между c и d ). Обратите внимание на начальные и конечные пробелы в последнем поле.
  2. С IFS=' :' , она будет разделена на пять полей: "a" , "b" , "" (пустая строка), "c" и "d" . Нет ни одного начального и конечного пробела.

Обратите внимание, что во втором примере несколько последовательных пробельных символов разделяют два поля, а несколько последовательных двоеточий - нет (поскольку они не являются пробельными символами).

Что же касается IFS=$'\n' , то есть ksh93 синтаксис также поддерживается bash , zsh , mksh и FreeBSD sh (с вариациями между всеми оболочками). Цитирую man-страницу bash:

Слова вида $ 'string' обрабатываются специально. Слово расширяется до «строки», символы с обратной косой чертой заменяются в соответствии со стандартом ANSI C.

\n является escape-последовательностью для новой строки, поэтому в IFS конечном итоге устанавливается один символ новой строки.

Favorite

Добавить в избранное (1 оценок, среднее: 5,00 из 5)

Как создать псевдонимы Bash

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

В этой статье мы расскажем о том, как построчно читать файл в Bash.

Считывание файла построчным синтаксисом

Наиболее общий синтаксис для чтения файла построчно:

или эквивалентная однострочная версия:

Как это работает?

Чтение файла построчные примеры

Давайте посмотрим на следующий пример. Предположим, у нас есть файл с именем, distros.txt содержащий список некоторых наиболее популярных дистрибутивов Linux и менеджеры пакетов, разделенные запятой (,):

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

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

В следующем примере мы устанавливаем IFS для запятой (,) и передаем две переменные distro и pm команде чтения. Все от начала строки до первой запятой будет присвоено первой переменной ( distro), а остальная часть строки будет назначена второй переменной ( pm):

Альтернативные методы чтения файлов

Использование процесса замены

Подстановка процесса позволяет вам передавать вывод команды в виде имени файла:

Использование строки Here

Здесь строка является вариантом heredoc. Строка (cat input_file ) будет содержать новые строки:

Использование файлового дескриптора

Вы также можете предоставить вход для цикла, используя дескриптор файла:

При работе с файловыми дескрипторами используйте число от 4 до 9, чтобы избежать конфликта с внутренними файловыми дескрипторами оболочки.

Заключение

В Bash мы можем прочитать файл построчно, указав имя файла в качестве входного для цикла чтения.

Если у вас есть какие-либо вопросы или отзывы, не стесняйтесь оставлять комментарии.

Если вы нашли ошибку, пожалуйста, выделите фрагмент текста и нажмите Ctrl+Enter.

Favorite

Добавить в избранное

7 примеров команды lsof в Linux

В этой статье вы узнаете, как вывести список открытых файлов пользователем или процессом с помощью команды lsof в Linux.

М ы думаем, что в какой-то момент вы задавались вопросом, есть ли способ показать открытые файлы процесса или пользователя. Хорошо, что ответ на этот вопрос это команда lsof.

Позвольте нам показать вам наиболее распространенное использование команды lsof.

Примеры команды l sof

Если вы используете команду lsof без каких-либо параметров и аргументов, она выведет список всех открытых файлов всеми процессами в системе.

Вывод должен быть таким:

Выводы в основном говорят сами за себя, но вы все еще можете задаться вопросом о столбцах FD и TYPE.

FD означает файловый дескриптор. Некоторые из общих значений для FD:

TYPE это не просто. Он определяет тип файла. Вот некоторые примеры:

Доверьтесь нам. Вы не захотите запускать команду lsof без аргументов.

Почему мы это говорим? Потому что он начнет заполнять ваш экран тысячами результатов.

Если мы запускаем команду lsof на сервере Ubuntu и подсчитываем количество строк с помощью команды wc, вот результат.

Да! Вот так. В системе открыто более одиннадцати тысяч файлов, открытых различными процессами.

Не беспокойтесь, команда lsof очень полезна при отладке, потому что вы можете видеть, какие процессы открывают, какие файлы и какой файл открывается каким процессом.

Если вы не вошли в систему как root, вывод команды lsof будет очень ограничен. Рекомендуется использовать sudo, если вы вошли в систему как пользователь без полномочий root.

1. Перечислите все процессы, которые открыли файл

Это просто Вам просто нужно указать путь к файлу.

2. Список всех файлов, открытых пользователем

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

Вы также можете указать более одного пользователя, как это:

3. Список всех открытых файлов в каталоге

Если вам интересно, какие из файлов были открыты в определенном каталоге, вы можете использовать команду lsof с опцией + D.

Поиск рекурсивный. Таким образом, он перечислит все открытые файлы в указанном каталоге и все его подкаталоги.

4. Перечислите все открытые файлы процессом

В этом случае вам нужно знать идентификатор процесса (pid). Если вы знаете идентификатор процесса, вы можете использовать опцию -p команды lsof, чтобы найти файлы, открытые им.

Вы также можете указать несколько идентификаторов процессов.

5. Список всех файлов, открытых командой

6. Найти открытый пользователем и командой или процессом

Вы можете комбинировать параметры, такие как пользователь и команда, и процесс, используя вариант -, Думайте об этом как об операторе AND. Это дает вам дополнительный фильтр при попытке сузить область поиска.

Читать The Flying Penguin: бортовые развлекательные системы Linux

7. Перечислите сетевые соединения и порты с помощью команды lsof

Вы также можете использовать команду lsof для поиска открытых портов или для поиска того, какой процесс использует порт.

Вы можете подать все виды открытых портов с опцией -i:

Вывод может выглядеть так:

Вы также можете указать тип сетевого подключения. Например, чтобы вывести список всех открытых портов TCP, вы можете использовать:

Чтобы узнать, какой процесс использует определенный порт, вы можете указать номер порта:

Бонусный совет: использование оператора отрицания с lsof

Вы можете использовать оператор отрицания, чтобы исключить пользователя или процесс при использовании команды lsof.

Например, вы хотите перечислить все файлы, открытые пользователем, отличным от root, используйте его следующим образом:

Команда lsof становится еще более полезной, когда вы используете ее с командой grep.

Мы надеемся, что вы узнали что-то новое с этой статьей. Если у вас есть вопросы или предложения, пожалуйста, оставьте комментарий ниже.

Если вы нашли ошибку, пожалуйста, выделите фрагмент текста и нажмите Ctrl+Enter.

Следующие несколько тем на этом сайте и StackOverflow были полезны для понимания того, как IFS работает:

Но у меня все еще есть несколько коротких вопросов. Я решил спросить их в том же посте, так как думаю, что это может помочь лучшим будущим читателям:

Q1. IFS обычно обсуждается в контексте «разделения поля». Является ли разделение полей так же , как слово расщепления ?

Q2: спецификация POSIX гласит :

Если значение IFS равно нулю, разделение полей не производится.

Установка IFS= совпадает с установкой IFS на ноль? Это то, что подразумевается под установкой его empty string тоже?

Q3: В спецификации POSIX я прочитал следующее:

Если IFS не установлен, оболочка должна вести себя так, как если бы значение IFS было <space>, <tab> and <newline>

Скажем, я хочу восстановить значение по умолчанию IFS . Как мне это сделать? (более конкретно, как я имею в виду <tab> и <newline> ?)

Q4: наконец, как бы этот код:

вести себя, если мы изменим первую строку на

  1. Да, они одинаковы.
  2. Да.
  3. В bash и подобных оболочках вы могли бы сделать что-то вроде IFS=$' \t\n' . В противном случае вы можете вставить буквенные управляющие коды, используя [space] CTRL+V [tab] CTRL+V [enter] . Однако если вы планируете сделать это, лучше использовать другую переменную, чтобы временно сохранить старое IFS значение, а затем восстановить его (или временно переопределить для одной команды, используя var=foo command синтаксис).
    • Первый фрагмент кода поместит всю строку, дословно прочитанную, так $line как нет разделителей полей, для которых нужно разделять слова. Имейте в виду, однако, что, поскольку многие оболочки используют cstrings для хранения строк, первый экземпляр NUL может по-прежнему вызывать преждевременное завершение его появления.
    • Второй фрагмент кода может не помещать точную копию ввода в $line . Например, если имеется несколько последовательных разделителей полей, они будут преобразованы в один экземпляр первого элемента. Это часто признается потерей окружающего пробела.
    • Третий фрагмент кода будет работать так же, как и второй, за исключением того, что он будет разделен только пробелом (не обычным пробелом, символом табуляции или новой строкой).
Ответ на вопрос 2 неправильный: пустое IFS и неустановленное IFS значения очень разные. Ответ на вопрос 4 отчасти неправильный: внутренние разделители здесь не затрагиваются, только ведущие и конечные. @ Жиль: во втором квартале ни одно из трех названных конфессий не относится к неустановленному IFS , все они имеют в виду IFS= . @ StéphaneGimenez, Крис: Да, извините за вопрос 2, я неправильно понял вопрос. Для Q4 мы говорим о read ; последняя переменная захватывает все, что осталось, кроме последнего разделителя, и оставляет внутренние разделители внутри. Жиль частично прав насчет того, что места не удаляются чтением. Прочитайте мой ответ для деталей.

Q1: да. «Разделение полей» и «разделение слов» являются двумя терминами одного и того же понятия.

Q2: да. Если IFS не установлено (то есть после unset IFS ), это эквивалентно IFS установке $' \t\n' (пробел, табуляция и перевод строки). Если IFS установлено пустое значение (это то, что здесь означает «ноль») (т. Е. После IFS= или IFS='' или IFS="" ), разделение полей вообще не выполняется (и $* , как правило, использует первый символ $IFS , использует пробел).

Q3: Если вы хотите иметь IFS поведение по умолчанию , вы можете использовать unset IFS . Если вы хотите IFS явно установить это значение по умолчанию, вы можете поместить пространство буквенных символов, табуляцию, символ новой строки в одинарные кавычки. В ksh93, bash или zsh вы можете использовать IFS=$' \t\n' . В частности, если вы хотите избежать буквального символа табуляции в исходном файле, вы можете использовать

Q4: с IFS установленным на пустое значение, read -r line устанавливает line на всю строку, кроме завершающей новой строки. С помощью IFS=" " пробелов в начале и конце строки обрезаются. При значении по умолчанию IFS вкладки и пробелы обрезаются.

Читайте также: