Форум русскоязычного сообщества Ubuntu


Получить помощь и пообщаться с другими пользователями Ubuntu можно
на irc канале #ubuntu-ru в сети Freenode
и в Jabber конференции ubuntu@conference.jabber.ru

Автор Тема: переписать с perl на bash  (Прочитано 867 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Krjd

  • Автор темы
  • Гость
переписать с perl на bash
« : 18 Января 2015, 19:26:09 »
Доброго времени суток
переделывая чужой скрипт на bash под себя, наткнулся на строчку с perl
perl я к сожалению не знаю и изучать не планировал
кто-нибудь может помочь переписать строчку на bash (если возможно и это не слишком громоздко) или хотя бы точно описать что именно делает эта строчка

for user in "${USERS[@]}"; do
    homedir=$(cat /etc/passwd | perl -ne "if(/^(\S+):.*:.*:.*:.*:(.+):.*/ && \\$1 eq "$user"){print \\$2;}")
    ...
done

я понимаю что она примерно должна делать - вытаскивать путь до папки юзера, но поскольку я плохо знаком со структурой /etc/passwd хотелось бы использовать уже кем-то отлаженный код, что бы избежать возможных ошибок


Пользователь решил продолжить мысль [time]18 Январь 2015, 20:06:46[/time]:
и еще вот эту
list=$(cat $homedir/.backup-list | perl -ne "print \"'${homedir:1}/\"; chomp; print; print \"' \";")если возможно...
« Последнее редактирование: 18 Января 2015, 23:43:33 от D101101 »

Оффлайн Azure

  • Модератор раздела
  • Старожил
  • *
  • Сообщений: 6017
  • Windows10, i3wm on Debian9, Manjaro20.0
    • Просмотр профиля
Re: переписать с perl на bash
« Ответ #1 : 18 Января 2015, 20:07:39 »
Как на меня корявый perl-скрипт… (он работает и в bash). Присваивает переменной homedir  домашнюю директорию соответствующего пользователя user (берется циклом из массива USERS), которую находит поиском по файлу /etc/passwd
Код: (bash) [Выделить]
for user in "${USERS[@]}"; do
    homedir=$(sed -nr "/^$user/s/([^:]*:){5}([^:]+):.*/\2/p" /etc/passwd)
    ...
done
Ну что Вы как маленький… Посмотрите echo $list или выполните cat $homedir/.backup-list | perl -ne "print \"'${homedir:1}/\"; chomp; print; print \"' \";"и всё станет ясно. И покажите что в $homedir/.backup-list
« Последнее редактирование: 18 Января 2015, 20:16:46 от Azure »
В Linux можно сделать ВСЁ что угодно, достаточно знать КАК !

whatdoyouneed

  • Автор темы
  • Гость
Re: переписать с perl на bash
« Ответ #2 : 18 Января 2015, 20:11:04 »
perl - read-only язык  ;)

Домашний каталог вытаскивает

cat /etc/passwd  | cut -d: -f6

Krjd

  • Автор темы
  • Гость
Re: переписать с perl на bash
« Ответ #3 : 18 Января 2015, 20:26:07 »
Azure,
Цитировать
Ну что Вы как маленький… Посмотрите echo $list или выполните cat $homedir/.backup-list | perl -ne "print \"'${homedir:1}/\"; chomp; print; print \"' \";"и всё станет ясно. И покажите что в $homedir/.backup-list
это понятно, но я не могу просто так взять и придумать все возможные ситуации, которые, я надеюсь, обрабатывает эта команда
суть моего вопроса не в том, что получится на выходе, а какие ситуации предусмотрены в этой строке

perl - read-only язык  ;)

Домашний каталог вытаскивает

cat /etc/passwd  | cut -d: -f6
т.е. путь всегда должен быть в 6 поле?

whatdoyouneed

  • Автор темы
  • Гость
Re: переписать с perl на bash
« Ответ #4 : 18 Января 2015, 20:28:37 »
)))
Да

Krjd

  • Автор темы
  • Гость
Re: переписать с perl на bash
« Ответ #5 : 18 Января 2015, 20:36:19 »
Andrey.,
хм, тогда...зачем тут кто-то запихал perl?..
странно, ну ладно, спасибо

Оффлайн Azure

  • Модератор раздела
  • Старожил
  • *
  • Сообщений: 6017
  • Windows10, i3wm on Debian9, Manjaro20.0
    • Просмотр профиля
Re: переписать с perl на bash
« Ответ #6 : 18 Января 2015, 20:43:16 »
Andrey.,
Если быть до конца точным, то cut -d: -f6 /etc/passwd выводит $HOME-пути для всех пользователей системы, а нам нужен один — для конкретного пользователя.
D101101,
Да какие "ситуации"? Это просто обработка текста. А боитесь — оставьте как есть, перловые скрипты под bash прекрасно работают.

Пользователь решил продолжить мысль 18 Января 2015, 20:52:46:
Что касается 2-го скрипта то, по-моему, он просто "раскладывает" в строчку содержимое $homedir/.backup-list отделяя элементы «;» и дописывая путь $homedir вначале. Точнее — только опытным путём. На вкус и цвет… мне удобнее tr а кому-то perl
« Последнее редактирование: 18 Января 2015, 20:52:46 от Azure »
В Linux можно сделать ВСЁ что угодно, достаточно знать КАК !

Krjd

  • Автор темы
  • Гость
Re: переписать с perl на bash
« Ответ #7 : 18 Января 2015, 21:39:02 »
Andrey.,
Если быть до конца точным, то cut -d: -f6 /etc/passwd выводит $HOME-пути для всех пользователей системы, а нам нужен один — для конкретного пользователя.

cat /etc/passwd  | grep ^"$user": | cut -d: -f6
думаю так должно быть нормально

на счет второго, в .backup-list список файлов или папок относительно домашней директории, по одному файлу или папке на строку
в итоге в list попадает
'home/sergey/.builds/' 'home/sergey/.config/' 'home/sergey/.dosbox/' 'home/sergey/Документы/' 'home/sergey/Изображения/' 'home/sergey/.backup-list'

Оффлайн Azure

  • Модератор раздела
  • Старожил
  • *
  • Сообщений: 6017
  • Windows10, i3wm on Debian9, Manjaro20.0
    • Просмотр профиля
Re: переписать с perl на bash
« Ответ #8 : 18 Января 2015, 22:08:12 »
Код: (bash) [Выделить]
sed "s|.*|\'${homedir#\/}&\'|" "$homedir/.backup-list" | tr '\n' ' 'И тогда уже если sed-скрипт не понравился
Код: (bash) [Выделить]
grep "^${user}:" /etc/passwd | cut -d: -f6
В Linux можно сделать ВСЁ что угодно, достаточно знать КАК !

Krjd

  • Автор темы
  • Гость
Re: переписать с perl на bash
« Ответ #9 : 18 Января 2015, 23:42:20 »
Azure,
спасибо

 

Страница сгенерирована за 0.018 секунд. Запросов: 23.