Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Операционные системы » UNIX » UNIX Shell: sh, bash, zsh; Coreutils и ко.; sed, awk, perl;

Модерирует : ShriEkeR

 Версия для печати • ПодписатьсяДобавить в закладки
Страницы: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154

Открыть новую тему     Написать ответ в эту тему

digital422

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Товарищи вопрошающие! Если ваша система отлична от ГНУ, и в то же время вы желаете обойтись только дефолтными средствами, указывайте и то и другое сразу, пожалуйста.


UNIX Shell

 
   Это глобальная тема по юниксовой командной оболочке, как по интерактивной работе в командной строке, так и по шелл-скриптам. Ключевые слова: sh, bash, zsh, tcsh, busybox, readline, coreutils, cp, mv, ln, rm, ls, readlink, mkdir, touch, stat, date, test, sleep, chown, chmod, chattr, dd, df, du, env, echo, cat, less, man, grep, sort, findutils, find, locate, xargs, md5sum, cmp, diff, patch, ps, kill, killall, tar, gzip, bzip2, xz, mount, fdisk, parted, mkfs, fsck, e2fsprogs, mtools, ss, netcat, netstat, rsync, ssh, scp, sftp, lftp, ncftp, time, strace.
   Неинтерактивная обработка текста (sed, awk, perl) пока тоже здесь.
   Смотри в других ветках: wget, convert, montage, mogrify и др., gs, git, 7z, p7zip, soffice, mplayer, mencoder, vlc, vim, mc, mcedit, kioclient.
 
 

Hint! Русские маны (подустаревшие, не всегда полные и не всегда для вашей системы) можно попытаться найти на Опеннете, к примеру: bash, tar, grep.

 
Готовые решения:
  • commandlinefu.com
    Крупнейшая база полезных однострочников на командной оболочке с ранжированием на основе пользовательского голосования.
     
  • shell-fu.org
    Аналогично, но поменьше и формат записей более свободный, поэтому встречаются и однострочники, и развернутые скрипты, и просто советы.
     
  • Useful one-line scripts for sed
    Почти исчерпывающий список решений для тех случаев, когда sed незаменим. Более сложные скрипты с sed.sf.net — только для тех, кто знает толк... :)

 
Учебная литература:
  • Greg’s Wiki (http://mywiki.wooledge.org)
    Наиболее обширный авторский сборник постоянно обновляющихся материалов по Башу.

    1. Bash Pitfalls
      (Частые ошибки программирования на Баше: [1], [2], [3], [4], [5] — пер. на русский по сост. на дек. 2008 г.).
      Рассмотрены преимущественно ошибки, возникающие из-за непонимания отличия шелла от «нормальных» скриптовых языков. Если вы уже владеете, например, Перлом, то это вполне может быть ваше первое руководство для ознакомления с Башем.
    2. Bash FAQ
    3. Bash Guide
    4. Bash Reference Sheet
      Шпаргалка по частым синтаксическим оборотам.

 
Классическая учебная литература:
С одной стороны не упомянуть эти издания нельзя, с другой — они настолько устарели, что едва ли их можно рекомендовать в роли учебника.

 

Смело правьте и дополняйте шапку, однако не забывайте отписываться об исправлениях и сохранять исходный вариант под #.
Первый пост темы имел вид...

Всего записей: 360 | Зарегистр. 19-04-2003 | Отправлено: 18:51 16-05-2008 | Исправлено: qw12, 09:42 24-03-2020
ASE_DAG



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
CrownRU> xmllint есть.  
 
Тогда нужен не «кусок из конфига», а конфиг полностью (ну либо полная структура до нужного поля).
 
Добавлено:
Хотя возможно, что и не нужен.  Проверьте сперва instance_get_import_path как таковую.  Остальное тоже, очевидно, не проверял.
 

#!/bin/bash
 
instance_init ()
{
    local instance="$1"
    local action="$2"
    "$instance/bin/${instance/'/'/'_'}.sh" "$action"
}
 
instance_get_import_path ()
{
    local instance="$1"
    xmllint --xpath '//placeholder[@name="importPath"]/node()' \
            "$instance/config/${instance/'/'/'_'}.xml"
}
 
cd '/archive/obj/bastore/'
 
for instance in ?/*; do
    [[ -d "$instance/failed" ]] || continue
    instance_init "$instance" stop
    rm -r -- "$instance/system"
    mv -- "$instance/failed"/* "$(instance_get_import_path "$instance")"
    instance_init "$instance" start
done

 
Простор для оптимизации тут тоже громадный.  Хорошо бы было, к примеру не разбирать конфиги каждый раз (они же у вас не меняются сами по себе, верно?), но для этого надо, очевидно не по крону это запускать, а держать демоном.

----------
Dmitry Alexandrov <321942@gmail.com> [PGP] [BTC]

Всего записей: 9272 | Зарегистр. 12-05-2005 | Отправлено: 14:12 23-08-2016
CrownRU



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Вот один из...
 
Script
 
Добавлено:
Эхх... Дураком помру...
 
Как проверить instance_get_import_path ?
 
Добавлено:

Цитата:
Хорошо бы было, к примеру не разбирать конфиги каждый раз

 
Конфиги не везде одинаковые - там комментарий, здесь лишний параметр, где-то еще что-то...
 
Добавлено:
Попробовал xmllint запустить :/
Unknown option --xpath
 
Добавлено:
xmllint --version
xmllint: using libxml version 20706

Всего записей: 212 | Зарегистр. 14-01-2003 | Отправлено: 14:32 23-08-2016 | Исправлено: CrownRU, 16:08 20-11-2017
ASE_DAG



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
CrownRU
>> Хорошо бы было, к примеру не разбирать конфиги каждый раз
> Конфиги не везде одинаковые - там комментарий, здесь лишний параметр, где-то еще что-то...  
 
Но каждый раз-то они одинаковые, я надеюсь.
 
> Как проверить instance_get_import_path?
 
Вы безусловно верно подумали, что коль скоро функция состоит из одной строчки, то можно просто запустить эту строчку, но в общем случае, например, так: взять функцию, скопировать ее в интерактивную оболочку:
 

$ instance_get_import_path ()
> {
>     local instance="$1"
>     xmllint --xpath '//placeholder[@name="importPath"]/node()' \
>             "$instance/config/${instance/'/'/'_'}.xml"
> }  

 
А затем выполнить в ней:
 
$ instance_get_import_path N/NSP_F3
 
> Попробовал xmllint запустить :/
> Unknown option --xpath
 
О господи, опять у вас там какие-то древности.
 
Хорошо, прежде чем начинать костылить спрошу, может быть есть xsltproc(1)?

----------
Dmitry Alexandrov <321942@gmail.com> [PGP] [BTC]

Всего записей: 9272 | Зарегистр. 12-05-2005 | Отправлено: 17:02 23-08-2016
CrownRU



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Есть, как ни странно...
 

Код:
xsltproc --version
Using libxml 20706, libxslt 10124 and libexslt 813
xsltproc was compiled against libxml 20701, libxslt 10124 and libexslt 813
libxslt 10124 was compiled against libxml 20701
libexslt 813 was compiled against libxml 20701
 

Всего записей: 212 | Зарегистр. 14-01-2003 | Отправлено: 17:11 23-08-2016
ASE_DAG



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
CrownRU, о!  Тогда держите:
 

instance_get_import_path ()
{
    local instance="$1"
    xsltproc --novalid --nonet \
             - "$instance/config/${instance/'/'/'_'}.xml" << 'EOF'
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0"
                xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="text" encoding="utf-8" />
  <xsl:template match="/">
    <xsl:value-of select="//placeholder[@name='importPath']/node()" />
  </xsl:template>
</xsl:stylesheet>
EOF
}

 
Не проверял.

----------
Dmitry Alexandrov <321942@gmail.com> [PGP] [BTC]

Всего записей: 9272 | Зарегистр. 12-05-2005 | Отправлено: 17:41 23-08-2016
ASE_DAG



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
CrownRU, как успехи?
 



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

instance_get_import_path ()
{
    local instance="$1"
    xmllint --shell "$instance/config/${instance/'/'/'_'}.xml" \
            3>&1 1>&- 2>&- << 'EOF'
cd //placeholder[@name="importPath"]/node()
write /dev/fd/3
EOF
}


----------
Dmitry Alexandrov <321942@gmail.com> [PGP] [BTC]

Всего записей: 9272 | Зарегистр. 12-05-2005 | Отправлено: 21:02 23-08-2016 | Исправлено: ASE_DAG, 21:04 23-08-2016
Alukardd



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Вопрос
 
stupom
Нет, локи это стандартный способ для всех языков (правда иногда используются более сложные механизмы вроде семафоров).
Из bash'а это делается, сюрприз-сюрприз, командой flock.
 
man 1 flock
man 2 flock


----------
Microsoft gives you windows, linuх gives you the whole house...
I've been using Vim for about 4 years now, mostly because I can't figure out how to exit it.

Всего записей: 6571 | Зарегистр. 28-08-2008 | Отправлено: 10:11 24-08-2016
CrownRU



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ASE_DAG

Цитата:
CrownRU, как успехи?  

Прошу прощения, с сыном к врачу ходил.
 
Может я что-то делаю не так?
Запустил в баше функцию, затем ошибка:
 

Код:
# instance_get_import_path /archive/obj/bastore/N/NSP_F3
warning: failed to load external entity "/archive/obj/bastore/N/NSP_F3/config//archive/obj/bastore/N/NSP_F3.xml"
unable to parse /archive/obj/bastore/N/NSP_F3/config//archive/obj/bastore/N/NSP_F3.xml


Всего записей: 212 | Зарегистр. 14-01-2003 | Отправлено: 13:34 24-08-2016 | Исправлено: CrownRU, 13:43 24-08-2016
Alukardd



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
CrownRU
Ну тут т. ASE_DAG рассчитывал что ты уже выполнил cd в каталог /archive/obj/bastore. И в переменную $instance попадёт только относительный путь, например N/NSP_F3.

----------
Microsoft gives you windows, linuх gives you the whole house...
I've been using Vim for about 4 years now, mostly because I can't figure out how to exit it.

Всего записей: 6571 | Зарегистр. 28-08-2008 | Отправлено: 15:55 24-08-2016 | Исправлено: Alukardd, 15:56 24-08-2016
CrownRU



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Alukardd
Да так и так пробовал, все равно ошибка

Код:
 
/archive/obj/bastore # instance_get_import_path N/NSP_F3
warning: failed to load external entity "N/NSP_F3/config/N/NSP_F3.xml"
unable to parse N/NSP_F3/config/N/NSP_F3.xml


Всего записей: 212 | Зарегистр. 14-01-2003 | Отправлено: 16:53 24-08-2016
Alukardd



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
CrownRU
А код обёртки над функцией-то как выглядит?

----------
Microsoft gives you windows, linuх gives you the whole house...
I've been using Vim for about 4 years now, mostly because I can't figure out how to exit it.

Всего записей: 6571 | Зарегистр. 28-08-2008 | Отправлено: 20:17 24-08-2016
ASE_DAG



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
CrownRU

>> CrownRU, как успехи?
> Прошу прощения, с сыном к врачу ходил.
 
Ну вот, заставил вас извиняться, будто бы вы в чем-то виноваты.  Надо, наверное, объясниться.  Я обычно спрашиваю «как успехи», когда у меня возникают подозрения, что собеседник завяз в благородных (без шуток) попытках действовать с соответствии с сетевым этикетом и хорошенько думать прежде чем бросаться с дополнительными вопросами; тогда как в данном случае — с программками, при которых сказано «не проверял» — это не особо целесообразно, ибо там вполне могут именно мои ошибки, вплоть до опечаток.

 
>> "$instance/config/${instance/'/'/'_'}.xml"
>>                             ^^^^^^^^
> unable to parse N/NSP_F3/config/N/NSP_F3.xml
>                                  ^
 
Но в данном случае ошибок я не вижу; а предполагаю опять какой-то древний Баш на вашей стороне.  Проверьте-ка минимальный пример:

$ s='a/b'
$ echo ${s/\//_}
a_b

 
 
Добавлено:
Alukardd> А код обёртки над функцией-то как выглядит?
 
Какой еще «обертки»?  Написано же: $ instance_get_import_path N/NSP_F3 — все.

----------
Dmitry Alexandrov <321942@gmail.com> [PGP] [BTC]

Всего записей: 9272 | Зарегистр. 12-05-2005 | Отправлено: 20:58 24-08-2016 | Исправлено: ASE_DAG, 21:01 24-08-2016
Alukardd



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ASE_DAG
Цитата:
Какой еще «обертки»?  Написано же: $ instance_get_import_path N/NSP_F3 — все.
Ну я думал, там рекурсивный обоход в цикле какой.

----------
Microsoft gives you windows, linuх gives you the whole house...
I've been using Vim for about 4 years now, mostly because I can't figure out how to exit it.

Всего записей: 6571 | Зарегистр. 28-08-2008 | Отправлено: 21:20 24-08-2016
CrownRU



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Цитата:
Ну вот, заставил вас извиняться, будто бы вы в чем-то виноваты.  Надо, наверное, объясниться.  Я обычно спрашиваю «как успехи», когда у меня возникают подозрения, что собеседник завяз в благородных (без шуток) попытках действовать с соответствии с сетевым этикетом и хорошенько думать прежде чем бросаться с дополнительными вопросами; тогда как в данном случае — с программками, при которых сказано «не проверял» — это не особо целесообразно, ибо там вполне могут именно мои ошибки, вплоть до опечаток.  
 
 
>> "$instance/config/${instance/'/'/'_'}.xml"  
>>                             ^^^^^^^^  
> unable to parse N/NSP_F3/config/N/NSP_F3.xml  
>                                  ^  
 
Но в данном случае ошибок я не вижу; а предполагаю опять какой-то древний Баш на вашей стороне.  Проверьте-ка минимальный пример:  
 
$ s='a/b'  
$ echo ${s/\//_}  
a_b  
 

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

Код:
 
SO-0A216:/archive/obj/bastore # s='a/b'
SO-0A216:/archive/obj/bastore # echo ${s/\//_}
a_b


Всего записей: 212 | Зарегистр. 14-01-2003 | Отправлено: 22:51 24-08-2016
ASE_DAG



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
CrownRU> Вроде на "ты" были :-)
 
В публичном поле мне как-то проще со всеми на «вы».  Но если настаиваешь...

 
> Вот, вроде проходит, хотя и баш древний.
 
Хорошо, а так:

$ s='a/b'  
$ echo ${s/'/'/'_'}  
a_b

 
Если не пройдет, то понятно, что делать, я надеюсь.  :-)

----------
Dmitry Alexandrov <321942@gmail.com> [PGP] [BTC]

Всего записей: 9272 | Зарегистр. 12-05-2005 | Отправлено: 00:37 25-08-2016
CrownRU



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Я не настаиваю
 
Вот, есть разница:
 

Код:
SO-0A216:/archive/obj/bastore # s='a/b'
SO-0A216:/archive/obj/bastore # echo ${s/\//_}
a_b
 
SO-0A216:/archive/obj/bastore # s='a/b'
SO-0A216:/archive/obj/bastore # echo ${s/'/'/'_'}
a/b
 


Всего записей: 212 | Зарегистр. 14-01-2003 | Отправлено: 10:33 25-08-2016 | Исправлено: CrownRU, 10:39 25-08-2016
ASE_DAG



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
CrownRU, ну так я надеюсь, понятно, что теперь делать?   Заменить в программке выше всякую ${.../'/'/'_'} на ${.../\//_}.
 
Но я бы еще все-таки не переразбирал конфиги каждые N минут, но держал бы это в памяти постоянно запущенной программки.  Вот так как-то:
 

#!/bin/bash
 
#config
TIMEOUT='5m'
 
instance_init ()
{
    local instance="$1"
    local action="$2"
    "$instance/bin/${instance/\//_}.sh" "$action"
}
 
instance_get_import_path ()
{
    local instance="$1"
    xsltproc --novalid --nonet \
             - "$instance/config/${instance/\//_}.xml" << 'EOF'
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0"
                xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="text" encoding="utf-8" />
  <xsl:template match="/">
    <xsl:value-of select="//placeholder[@name='importPath']/node()" />
  </xsl:template>
</xsl:stylesheet>
EOF
}
 
process_failed_instances ()
{
    for instance in "${instances[@]}"; do
        [[ -d "$instance/failed" ]] || continue
        instance_init "$instance" stop
        rm -r -- "$instance/system"
        mv -- "$instance/failed"/* "${import_paths[$instance]}"
        instance_init "$instance" start
    done
}
 
declare -a instances
declare -A import_paths
 
cd '/archive/obj/bastore/'
instances=( ?/* )
 
for instance in "${instances[@]}"; do
    import_paths["$instance"]=$(instance_get_import_path "$instance")
done
 
while :; do
    process_failed_instances
    sleep $TIMEOUT
done

 
Опять же, не проверял.

----------
Dmitry Alexandrov <321942@gmail.com> [PGP] [BTC]

Всего записей: 9272 | Зарегистр. 12-05-2005 | Отправлено: 11:46 25-08-2016
CrownRU



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Опять
 

Код:
/tmp/aaa.sh: line 41: declare: -A: invalid option
declare: usage: declare [-afFirtx] [-p] [name[=value] ...]
/tmp/aaa.sh: line 47: F/FQP_RA: division by 0 (error token is "A")
Stopping moreen for instance F_FQP_RA
rm: cannot remove `F/FQP_RA/system': Directory not empty
/tmp/aaa.sh: line 35: F/FQP_RA: division by 0 (error token is "A")
 

Всего записей: 212 | Зарегистр. 14-01-2003 | Отправлено: 12:02 25-08-2016
Alukardd



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
CrownRU
Отсутствие ассоциативных массивов
 
У меня на работе тоже не всегда есть возможность принести в систему нужный мне пакет, но зато всегда есть возможность скопировать туда исполняемый файл.
Скопилируй ты уже себе статичный бинарник со свежим bash'ом и положи на все машины. Ну и соответсвенно пропишешь в своих скриптах вместо /bin/bash, какой-нить /usr/local/bin/bash4 или даже /home/crownru/bash4.

----------
Microsoft gives you windows, linuх gives you the whole house...
I've been using Vim for about 4 years now, mostly because I can't figure out how to exit it.

Всего записей: 6571 | Зарегистр. 28-08-2008 | Отправлено: 12:50 25-08-2016
CrownRU



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Цитата:
CrownRU  
Отсутствие ассоциативных массивов  
 
У меня на работе тоже не всегда есть возможность принести в систему нужный мне пакет, но зато всегда есть возможность скопировать туда исполняемый файл.  
Скопилируй ты уже себе статичный бинарник со свежим bash'ом и положи на все машины. Ну и соответсвенно пропишешь в своих скриптах вместо /bin/bash, какой-нить /usr/local/bin/bash4 или даже /home/crownru/bash4.
 

 
Да мочь то я могу, но нельзя. За такое "атата" могут сделать. Я же машины не админю Но я попытаюсь получить разрешение.

Всего записей: 212 | Зарегистр. 14-01-2003 | Отправлено: 13:11 25-08-2016 | Исправлено: CrownRU, 13:15 25-08-2016
Открыть новую тему     Написать ответ в эту тему

Страницы: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154

Компьютерный форум Ru.Board » Операционные системы » UNIX » UNIX Shell: sh, bash, zsh; Coreutils и ко.; sed, awk, perl;


Реклама на форуме Ru.Board.

Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
Modified by Ru.B0ard
© Ru.B0ard 2000-2024

BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

Рейтинг.ru