Сохранение отдельных выходных строк в переменные

Существует несколько различных графических пользовательских сред, доступных для Linux, таких как GNOME, KDE или настольные среды Xfce. Такие настольные среды включают приложение панели, такое как Панель GNOME или Строка над заголовком KDE. Эти приложения обеспечивают панель задач и средство запуска приложения (эквивалент кнопки запуска Windows). Настольные среды также включают менеджер окон, часть программного обеспечения, которое управляет размещением и появлением окон приложения. Появление всех их может быть настроено с отличающийся виды тем.

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

Большая часть поставки дистрибутивов Linux с одной из упомянутых выше настольных сред, но обычно обеспечивает другие графические пользовательские среды для установки через их системы управления пакета. Даже если Вам, оказывается, не нравится стандартная среда поставки распределения с, Вы все еще могли бы хотеть, используют распределение в противоположность установке графической пользовательской среды по Вашему выбору с нуля, которая обычно не является никаким маленьким подвигом вообще.

Под настольной средой большинство настольных систем Linux имеет реализацию X-оконной системы, которая является инфраструктурой системного уровня для графического интерфейса пользователя. Каноническая реализация X является X.org сервер дисплея, который используется большинством настольных дистрибутивов Linux в эти дни.

Уэйленд является напористым протоколом сервера дисплея, который предназначается для замены X-оконной системы. Ссылочную реализацию составляющего композит менеджера окон для Уэйленда называют Weston. И GNOME и проекты KDE объявили, что они реализуют поддержку Уэйленда, но в настоящее время это не жизнеспособная альтернатива на рабочем столе, хотя это используется некоторыми основанными на Linux системами Развлекательно-информационной передачи в механизме (IVI).

2
26.08.2014, 01:41
3 ответа

Предполагая, что ни в одном из ваших имен файлов нет пробелов и т.п., есть несколько способов сделать это. Один из них - просто использовать массив:

files=( $(find -mtime -2) )
a=${files[1]}
b=${files[2]}

files будет массивом всех путей, выводимых методом find по порядку, проиндексированных с нуля. Вы можете получить из этого любые строчки, какие захотите. Здесь я сохранил вторую и третью строки в a и b , но вы также можете использовать элементы массива напрямую.

Альтернативным вариантом, если у вас есть GNU find или другой вариант с опцией printf , является использование его в сочетании с заменой процесса read и :

read junk a b junk < <(find -printf '%p ')

Это один превращает весь вывод find в одну строку, а затем предоставляет эту строку в качестве входных данных для read , который сохраняет первое слово (путь) в спам , второй в a , третий в b , а остальная часть строки снова в мусор .

Точно так же вы можете ввести команду paste для того же эффекта в любой POSIX-совместимой системе:

read junk a b junk < <(find -mtime -2 | paste -s)

paste -s преобразует входные данные в один разделенный табуляцией строка, которая читается , может быть обработана снова.

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

find | sed -n 2p

Это напечатает только вторую строку вывод путем подавления обычного вывода с помощью -n и выбора строки 2 по p rint. Вы также можете сшить вместе голову и хвост для того же эффекта, который, вероятно, будет более эффективным в очень длинном файле.

Все вышеперечисленное имеет одинаковый эффект сохранения второй и третьей строк в a и b , и все они по-прежнему предполагают, что нет пробелов, табуляции, новой строки , или любые другие символы, которые встречаются в вашем разделителе поля ввода ( IFS ) значение в любом из имен файлов.


Обратите внимание, что порядок вывода find не определен, поэтому «второй файл» на самом деле не является полезным идентификатором, если вы не организуете их для упорядочивания каким-либо другим способом. Скорее всего, это будет что-то близкое к порядку создания во многих случаях, но не во всех.

7
27.01.2020, 21:49

В bash 4.x вы можете использовать mapfile :

$ mapfile -t <<< "$(find -mtime -2)"
$ printf "%s\n" "${MAPFILE[0]}"
/home/user/logs/file-2014-08-22.log
$ printf "%s\n" "${MAPFILE[1]}"
/home/user/logs/file-2014-08-23.log

mapfile считывает строки из стандартного ввода в индексированный массив переменная, массив по умолчанию - MAPFILE . Вы можете указать имя массива:

mapfile -t array <<< "$(find -mtime -2)"

-t option cause mapfile удалить завершающую новую строку из каждой прочитанной строки.

5
27.01.2020, 21:49

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

Строка / скрипт:

$ counter=0; for log_file in $(find -mtime -2); do echo $log_file; if [ -f $log_file ]; then ((counter++)); eval var_$counter=`readlink -f $log_file`; fi; done

Вывод (как в обычном find ), если строка echo не удалена:

.
./logs
./logs/file-2014-08-22.log
./logs/file-2014-08-23.log

Но здесь я проверяю допустимые файлы, используя параметр if -f .... (как описано здесь ), и, следовательно, желаемая информация сохраняется:

$ echo $counter
2
$ echo $var_1
/home/shadowe/Videos/logs/file-2014-08-22.log
$ echo $var_2
/home/shadowe/Videos/logs/file-2014-08-23.log

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

1
27.01.2020, 21:49

Теги

Похожие вопросы