Автор Тема: Re: Приёмы профессиональной работы в shell (Вопросы по справочнику)  (Прочитано 13772 раз)

Петрович

  • Гость
Скрипт сохранит в файл nameinstpkgs+execs.txt имена всех установленных в системе пакетов и их исполняемые файлы
А можно одни графические?
пример
Name : LibreOffice-common
/usr/bin/libreoffice5.2


Name : LibreOffice-integrated
/usr/bin/lobase
/usr/bin/localc
/usr/bin/lodraw
/usr/bin/loffice
/usr/bin/loimpress
/usr/bin/lomath
/usr/bin/loqstart
/usr/bin/lowriter
« Последнее редактирование: 25.12.2016 14:07:01 от ruslandh »

Оффлайн ruslandh

  • Поспешай не торопясь !
  • Модератор глобальный
  • *****
  • Сообщений: 32 246
  • Учиться .... Телепатами не рождаются, ими ....
    • Email
Просили же приложения. Поэтому
find /usr/share/applications -name \*.desktop|xargs -n1 sed -n 's/^Exec=//p' | sort -fu

Оффлайн ruslandh

  • Поспешай не торопясь !
  • Модератор глобальный
  • *****
  • Сообщений: 32 246
  • Учиться .... Телепатами не рождаются, ими ....
    • Email
Можно ещё это довести до ума:

#!/bin/bash

name=$(find /usr/share/applications -name \*.desktop|xargs -n1 sed -n 's/^Exec=/

for pat in $name
do
  app1=$(echo $pat | grep -v % )
    if [ -n "$app1" ];then
        name_app=$(basename "$app1" 2>/dev/null)
            if [ -n "$name_app" ];then
                rpm_name=$(rpm -qf $(whereis $name_app) 2>/dev/null | sort -fu)
                echo $rpm_name $name_app
            fi
    fi
done



Петрович

  • Гость
Не так понял.
Это одно и тоже для терминала.
lowriter
libreoffice5.2 --writer

Оффлайн ruslandh

  • Поспешай не торопясь !
  • Модератор глобальный
  • *****
  • Сообщений: 32 246
  • Учиться .... Телепатами не рождаются, ими ....
    • Email
И что? А пользователь может ещё и своих алиасов придумать для консоли ..

Петрович

  • Гость

Оффлайн Speccyfighter

  • Мастер
  • ***
  • Сообщений: 10 259
Скрипт сохранит в файл nameinstpkgs+execs.txt имена всех установленных в системе пакетов и их исполняемые файлы
А можно одни графические?
пример
Name : LibreOffice-common
/usr/bin/libreoffice5.2


Name : LibreOffice-integrated
/usr/bin/lobase
/usr/bin/localc
/usr/bin/lodraw
/usr/bin/loffice
/usr/bin/loimpress
/usr/bin/lomath
/usr/bin/loqstart
/usr/bin/lowriter

С таким форматом вывода можно. :-)
И даже в двух вариантах:

Вариант I
rpm -qf --qf '%{name}\n' $(find /usr/share/applications -name \*.desktop)|sort -fu| \
        while read line; \
            do STR=`rpm -ql $line|grep 'bin/'|wc -m`; \
                 if [ "$STR" != 0 ]; \
                    then echo -e '\n'; rpm -qi $line|grep '^Name'|awk '{print $1,$2,$3}'; rpm -ql $line|grep 'bin/'; \
                 fi; \
        done \
  > guiappspkgs-execs-outformat1.txt
$ tail -n 25  guiappspkgs-execs-outformat1.txt
/usr/bin/xfce4-terminal


Name : xfdashboard
/usr/bin/xfdashboard
/usr/bin/xfdashboard-settings


Name : xfdesktop
/usr/bin/xfdesktop
/usr/bin/xfdesktop-settings


Name : xfwm4
/usr/bin/xfwm4
/usr/bin/xfwm4-settings
/usr/bin/xfwm4-tweaks-settings
/usr/bin/xfwm4-workspace-settings


Name : xterm
/usr/bin/koi8rxterm
/usr/bin/resize
/usr/bin/uxterm
/usr/bin/xterm

Вариант II
find /usr/share/applications -name \*.desktop|sort -fu| \
        while read line; \
            do PKG=`rpm -qf --qf '%{NAME}\n' $line`; \
               CMD=`grep ^Exec $line|sed -n 's/^Exec=//p'`; \
               echo -e '\n'; rpm -qi $PKG|grep '^Name'|awk '{print $1,$2,$3}'; echo $CMD
        done \
  > guiappspkgs-execs-outformat2.txt
$ tail -n 25  guiappspkgs-execs-outformat2.txt
xfwm4-settings


Name : xfwm4
xfwm4-tweaks-settings


Name : xfwm4
xfwm4-workspace-settings


Name : orage
orage -p


Name : xfdashboard
/usr/bin/xfdashboard


Name : xfdashboard
/usr/bin/xfdashboard-settings


Name : xterm
xterm -name XTerm

Первый вариант выше, на основе анализа *.desktop-файлов и их содержимого, а также пакетов в которых они лежат, выводит имя пакета и все исполняемые файлы в пакете.
Второй вариант, как и предлагали Skull с Русланом, с таким же форматом вывода на основе анализа содержимого *.desktop-файлов, - выводит имя пакета и строку-параметр для Exec=.
Если вам эти варианты подходят, их можно скопировать в советы с краткими комментариями.



Справиться с форматом вывода который предлагали парни, мне не удалось. Это был какой-то финиш...
Во-первых такой формат вывода абсолютно негуманный и при больших объёмах текста снесёт башню
find /usr/share/applications -name \*.desktop|sort -fu| \
    while read line; \
       do PKG=`rpm -qf --qf '%{NAME}\n' $line`; \
          CMD=`grep ^Exec $line|sed -n 's/^Exec=//p'`; \
          echo -e "$PKG\t\t\t\t$CMD"; \
    done

alterator-standalone acc
mozilla-plugin-adobe-flash xdg-open http://www.adobe.com/legal/licenses-terms.html
arandr arandr
atril-gtk atril %U
bluefish-common bluefish %F
libexo exo-open --launch FileManager %u
libexo exo-open --launch MailReader %u
libexo exo-preferred-applications
libexo exo-open --launch TerminalEmulator
libexo exo-open --launch WebBrowser %u
firefox firefox %u
mozilla-plugin-adobe-flash flash-player-properties
gimp gimp-2.8 %U
libgnomekbd gkbd-keyboard-display
libgksu gksu-properties
orage globaltime
mplayer gmplayer %U
gnome-screensaver gnome-screensaver
gparted /usr/bin/gparted %f
htop htop
imagewriter /usr/bin/xdg-su -c /usr/bin/imagewriter %f
branding-altlinux-sisyphus-indexhtml xdg-open /usr/share/doc/indexhtml/index.html
kompozer kompozer %u
...

А во-вторых:
После 12-ти часов сражений, заставить этого дебила sed, приклеить стринг к стрингу табличным выводом и сразу на стандартный вывод без использования промежуточного файла как ненужной сущности, мне так и не удалось.
Как только sed натыкается на слеш, он начинает сыпать ошибками интерпретируя каждый байт стринга, вместо того чтобы взять стринг из переменной и приклеить его к концу предыдушего стринга, построчно создавая табличный вывод, чтобы улучшить восприятие больших объёмов текста и не ломать глаза об монитор:
find /usr/share/applications -name \*.desktop|sort -fu| \
    while read line; \
       do PKG=`rpm -qf --qf '%{NAME}\n' $line`; \
          CMD=`grep ^Exec $line|sed -n 's/^Exec=//p'`; \
          echo $PKG | sed -r ':l;/.{30}/q;s/.*/& /;bl'| sed -n 's/$/'"$CMD"'/p'; \
    done

alterator-standalone          acc
sed: -e выражение #1, символ 20: неизвестный модификатор к `s'
arandr                        arandr
atril-gtk                     atril %U
bluefish-common               bluefish %F
libexo                        exo-open --launch FileManager %u
libexo                        exo-open --launch MailReader %u
libexo                        exo-preferred-applications
libexo                        exo-open --launch TerminalEmulator
libexo                        exo-open --launch WebBrowser %u
firefox                       firefox %u
mozilla-plugin-adobe-flash    flash-player-properties
gimp                          gimp-2.8 %U
libgnomekbd                   gkbd-keyboard-display
libgksu                       gksu-properties
orage                         globaltime
mplayer                       gmplayer %U
gnome-screensaver             gnome-screensaver
sed: -e выражение #1, символ 7: неизвестный модификатор к `s'
htop                          htop
sed: -e выражение #1, символ 6: неизвестный модификатор к `s'
sed: -e выражение #1, символ 15: неизвестный модификатор к `s'
kompozer                      kompozer %u
...

Приветствуется любой работающий код способный построчно отправить таблицу в формате пакет-команда на стандартный вывод.



ЗЫж
В двух последних скриптах выше, имя пакета обрезано с пакет-версия-сборка до пакет из практических соображений.
Некоторые строки имя_пакета--exec-команда, длинные, и на ноутбуках с разрешением 1024x768 (1024x600) текст будет резаться на экране.
Но если вам нужно полное имя пакета, уберите из скриптов
--qf '%{NAME}\n'
« Последнее редактирование: 26.12.2016 12:46:24 от Speccyfighter »

Петрович

  • Гость
Вариант I
Спасибо то что надо.
Есть мелочь повторяются.
Самое главное путь и имя есть.

Петрович

  • Гость
Повторения

Оффлайн Speccyfighter

  • Мастер
  • ***
  • Сообщений: 10 259
Повторения

Спасибо за сообщение.
Глаза устали, забыл про --unique в первом скрипте:
$ rpm -qf --qf '%{name}\n' $(find /usr/share/applications -name \*.desktop)|sort|wc -l
81
$ rpm -qf --qf '%{name}\n' $(find /usr/share/applications -name \*.desktop)|sort -fu|wc -l
55

Теперь повторений не должно быть
rpm -qf --qf '%{name}\n' $(find /usr/share/applications -name \*.desktop)|sort -fu| \
         while read line; \
             do STR=`rpm -ql $line|grep 'bin/'|wc -m`; \
                  if [ "$STR" != 0 ]; \
                     then echo -e '\n'; rpm -qi $line|grep '^Name'|awk '{print $1,$2,$3}'; rpm -ql $line|grep 'bin/'; \
                  fi; \
         done \
   > guiappspkgs-execs-outformat1.txt
$ grep ^Name guiappspkgs-execs-outformat1.txt|wc -l
53
$ grep ^Name guiappspkgs-execs-outformat1.txt|sort -fu|wc -l
53

Поправил первый скрипт в сообщении выше.
Проверьте ещё раз.

Петрович

  • Гость
Спасибо сейчас всё хорошо.

Петрович

  • Гость
Захват и перенаправление выводов в файл
Можно сделать в домашний каталог.
hdparm -I /dev/sda > /home/rr/Загрузки/info_HDD.txtНе навредит ли это?
ls -l /home/rr/Загрузки/info_HDD.txt
-rw-r--r-- 1 root root 2838 авг 26 16:06 /home/rr/Загрузки/info_HDD.txt
Удаляется от пользователя.
« Последнее редактирование: 26.08.2018 17:03:45 от Петрович »

Оффлайн Speccyfighter

  • Мастер
  • ***
  • Сообщений: 10 259
ls -l /home/rr/Загрузки/info_HDD.txt
-rw-r--r-- 1 root root 2838 авг 26 16:06 /home/rr/Загрузки/info_HDD.txt
Удаляется от пользователя.

Вообще-то с такими правами, пользователь не может и не должен удалить этот файл.
Может только как root или через sudo.
Но первый созданный в системе пользователь, это пользовательский аккаунт root, - не сиди под root-ом! Только он по-умолчанию входит в группу wheel. И только он может делегировать права другим пользователям.

Захват и перенаправление выводов в файл
Можно сделать в домашний каталог.
hdparm -I /dev/sda > /home/rr/Загрузки/info_HDD.txtНе навредит ли это?

Для самой системы не навредит: это только перенаправление информации в файл.
С точки зрения десктопа? Десктопный Линукс мало кому интересен, - его количество на десктопах близко к нулю. Разве что как ботнет.
А вот получить информацию о винчестере сервера, это уже интереснее.
Из фольклора программистов старой школы:
Все программы содержат ошибки.
Если ошибки нет в коде, то она в алгоритме.
Если ошибки нет ни в коде ни в алгоритме, то такая программа никому не нужна.

Петрович

  • Гость
Может только как root или через sudo.
Вот и спросил.
[rr@s-xfce ~]$ touch ~/Загрузки/Проба
[rr@s-xfce ~]$ ls -l ~/Загрузки/
итого 4
-rw-r--r-- 1 root root 2838 авг 26 22:09 info_HDD.txt
-rw-r--r-- 1 rr   rr      0 авг 26 22:10 Проба
[rr@s-xfce ~]$ rm ~/Загрузки/info_HDD.txt
rm: удалить защищенный от записи обычный файл '/home/rr/Загрузки/info_HDD.txt'? Y
[rr@s-xfce ~]$ ls -l ~/Загрузки/
итого 0
-rw-r--r-- 1 rr rr 0 авг 26 22:10 Проба

Оффлайн Speccyfighter

  • Мастер
  • ***
  • Сообщений: 10 259
Может только как root или через sudo.
Вот и спросил.
[rr@s-xfce ~]$ touch ~/Загрузки/Проба
[rr@s-xfce ~]$ ls -l ~/Загрузки/
итого 4
-rw-r--r-- 1 root root 2838 авг 26 22:09 info_HDD.txt
-rw-r--r-- 1 rr   rr      0 авг 26 22:10 Проба
[rr@s-xfce ~]$ rm ~/Загрузки/info_HDD.txt
rm: удалить защищенный от записи обычный файл '/home/rr/Загрузки/info_HDD.txt'? Y
[rr@s-xfce ~]$ ls -l ~/Загрузки/
итого 0
-rw-r--r-- 1 rr rr 0 авг 26 22:10 Проба

Поправлюсь:
Тут фишка в том, что если владелец файла другой пользователь, а владелец каталога в котором лежит файл, вы, то файл нельзя изменить, но можно удалить.
Но если владелец каталога в котором лежит файл, не вы, а владелец файла вы, то файл нельзя удалить, но можно изменить.
Если и владелец каталога в котором лежит файл, не вы и владелец файла не вы, то файл нельзя ни удалить ни изменить.
Суть в правах на файл и на каталог:
- Владение каталогом даёт право/запрет на удаление файла. Поскольку каталог, это тоже файл в определённом формате. И при удалении файла, этот файл-каталог изменяется.
- Владение файлом даёт право/запрет на изменение файла.

Исключение составляют случаи, когда на файле стоит атрибут immutable. В этом случае, ни изменить, ни удалить файл не может даже root:
# hdparm -I /dev/sda > /home/user/Загрузки/info_HDD.txt
# chattr +i /home/user/Загрузки/info_HDD.txt
# lsattr /home/user/Загрузки/info_HDD.txt
----i--------e-- /home/user/Загрузки/info_HDD.txt
$ rm ~/Загрузки/info_HDD.txt
rm: удалить защищенный от записи обычный файл '/home/user/Загрузки/info_HDD.txt'? Y
rm: невозможно удалить '/home/user/Загрузки/info_HDD.txt': Операция не позволена
# rm /home/user/Загрузки/info_HDD.txt
rm: удалить обычный файл '/home/user/Загрузки/info_HDD.txt'? Y
rm: невозможно удалить '/home/user/Загрузки/info_HDD.txt': Операция не позволена
# sed -i 's/non-removable/removable/' /home/user/Загрузки/info_HDD.txt
sed: невозможно переименовать /home/user/Загрузки/sede26Bng: Операция не позволена

Снять с файла атрибут immutable:
# lsattr /home/user/Загрузки/info_HDD.txt
----i--------e-- /home/user/Загрузки/info_HDD.txt
# chattr -i /home/user/Загрузки/info_HDD.txt
# lsattr /home/user/Загрузки/info_HDD.txt
-------------e-- /home/user/Загрузки/info_HDD.txt
« Последнее редактирование: 26.08.2018 23:32:58 от Speccyfighter »