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

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в 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
Taran2ul



Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Люди, помогите поправить скрипт, чтоб выводил результат в log-файл. Сам пытался, но ничего не получается.

Код:
#!/system/bin/sh
 
for i in \
`busybox find /data -iname "*.db"`;  
do \
    /system/xbin/sqlite3 $i 'VACUUM;';  
    /system/xbin/sqlite3 $i 'REINDEX;';  
done;
 
if [ -d "/dbdata" ]; then
    for i in \
    `busybox find /dbdata -iname "*.db"`;  
    do \
        /system/xbin/sqlite3 $i 'VACUUM;';  
        /system/xbin/sqlite3 $i 'REINDEX;';  
    done;
fi;
 
if [ -d "/datadata" ]; then
    for i in \
    `busybox find /datadata -iname "*.db"`;  
    do \
        /system/xbin/sqlite3 $i 'VACUUM;';  
        /system/xbin/sqlite3 $i 'REINDEX;';  
    done;
fi;
 
for i in \
`busybox find /sdcard -iname "*.db"`;  
do \
    /system/xbin/sqlite3 $i 'VACUUM;';  
    /system/xbin/sqlite3 $i 'REINDEX;';  
done;

 
Путь лога

Код:
LOG_FILE=/data/sqliteoptimize.log
 
if [ -e $LOG_FILE ]; then
    rm $LOG_FILE;
fi;  

Всего записей: 458 | Зарегистр. 18-02-2008 | Отправлено: 15:39 14-07-2016 | Исправлено: Taran2ul, 15:41 14-07-2016
Alukardd



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Taran2ul
Если нужно туда сгрести весь вывод и всегда, то просто напишите в начале скрипта, но после объявления переменной LOG_FILE.
Код:
exec &> $LOG_FILE
stdout и stderr будут в лог файле.
А почему бы просто не вызвать скрипт и в точке вызова сделать это перенаправление?

----------
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:48 14-07-2016
Taran2ul



Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Alukardd
он в init.d лежит

Всего записей: 458 | Зарегистр. 18-02-2008 | Отправлено: 16:50 14-07-2016
ASE_DAG



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
> for i in \
> `busybox find /data -iname "*.db"`;
> do \
 
Это ошибка.  На самом деле вы хотите написать что-то такое:
 
while read f; do
    ...
done < \
     <(busybox find /data -iname "*.db")

 
 
Плюс что это за китайский код?  Слова «подпрограмма» или хотя бы «цикл по списку» вам ничего не говорят?  Цикл по списку вам должен быть знаком, вы же им уже пользуетесь, да только не для того, для чего надо.
 
for dir in '/data' '/dbdata' '/datadata' '/sdcard'; do
    [ -d "$dir" ] || continue
    while read f; do
        ...
    done < \
         <(busybox find "$dir" -iname "*.db")
done

 
Но это для общего понимания, а здесь-то можно просто ничего не проверяя указать несколько путей find’у:
 
busybox find '/data' '/dbdata' '/datadata' '/sdcard' -iname "*.db"

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

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



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Alukardd
ASE_DAG
 
Благодарю, за столь быстрый ответ. Если о конкретной задаче,
 
то скрип запускающий консольную программу (внутри скрипта), предварительно сформировав в виде строки параметры для выполнение программы.
 
первый if это условие сколько "процессов/скриптов" запущено
затем количество данных параметров с помощью цикла увеличивается на 1 (в качестве параметров имена файлов в каталоге)
При наступлении какого-то определённого количества данных файлов (ограничение на строку с параметрами), выполняется программа с параметрами, уменьшается на один процесс.
И последнее если число параметров меньше ограничения приложение запускается с текущим.
 
Т.е. допустим диреретроия в ней 37 фалов "параметров"
ограничение в консольное програме на 10 параметров
разрешено не более 2 одновременных выполнений программы
скрипт запускает консольную программу сформировав в качестве параметра первые 10 файлов
exec blablabla
при достижении 2 процессов, срабатывает условие что 3 не запустится (т.е. обработанно только первые 20 файлов-параметров)
Как завершился один из процессов запускается следующий с файлами-параметрами
Если строка параметров не полная, запускается следующий процесс но с 7 фалами-параметрами, при условии что запущенно меньше 2 процессов

Всего записей: 1104 | Зарегистр. 30-12-2003 | Отправлено: 21:42 14-07-2016
ASE_DAG



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
SAVage22
 
> диреретроия в ней 37 фалов "параметров"
> ограничение в консольное програме на 10 параметров
> разрешено не более 2 одновременных выполнений программы  
 
$ parallel -n 10 -j 2 "$program" -- "$dir"/*

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

Всего записей: 9272 | Зарегистр. 12-05-2005 | Отправлено: 00:58 15-07-2016 | Исправлено: ASE_DAG, 01:01 15-07-2016
Taran2ul



Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ASE_DAG
код не мой, не исключаю того, что "китайский". Я в bash не силен. Только пробую.
Помогите в кучу собрать.

Код:
#!/system/bin/sh
 
LOG_FILE=/data/sqliteoptimize.log
 
if [ -e $LOG_FILE ]; then
    rm $LOG_FILE;
fi;
 
exec &> $LOG_FILE
 
while read f; do
    /system/xbin/sqlite3 $i 'VACUUM;';
    /system/xbin/sqlite3 $i 'REINDEX;';
done < \
     <(busybox find '/data' '/dbdata' '/datadata' '/sdcard' -iname "*.db")

Только в таком виде ругается на последнюю строку. И не понятно где мы присваиваем $i
 
А еще вопрос по строке

Код:
/system/xbin/sqlite3 $i 'VACUUM;';

разве нельзя писать так

Код:
/system/xbin/sqlite3 $i VACUUM

Всего записей: 458 | Зарегистр. 18-02-2008 | Отправлено: 13:26 15-07-2016
ASE_DAG



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Taran2ul
 
> rm $LOG_FILE;
 
С целью?  Обнулить содержимое — exec &> "$LOG_FILE" обнулит — одна > же.
 
И да, возьмите в привычку закавычивать строковые переменные, как я сейчас сделал.
 
> Только в таком виде ругается на последнюю строку.  
 
Не вижу.
 
> И не понятно где мы присваиваем $i
 
Очевидно, нигде.  Мы присваиваем $f.
 
> разве нельзя писать так
> /system/xbin/sqlite3 $i VACUUM
 
Вы полагаете, что я помню все особенности синтаксиса sqlite3 наизусть?   Что вам мешает проверить и узнать?

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

Всего записей: 9272 | Зарегистр. 12-05-2005 | Отправлено: 14:10 15-07-2016 | Исправлено: ASE_DAG, 16:02 15-07-2016
Taran2ul



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

Код:
/system/etc/init.d/alxt[18]: syntax error: '<' unexpected  

Всего записей: 458 | Зарегистр. 18-02-2008 | Отправлено: 14:53 15-07-2016
Alukardd



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Taran2ul
Если скрипт скопирован на форум по символьно, то у Вас пробел стоит после обратного слеша, и экранируете таким образом вы его а не перевод строки.

----------
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 15-07-2016
Taran2ul



Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Alukardd
нет. После слеша сразу перевод каретки, дальше на новой строке табуляция и знак меньше (на который и ругается при выполнении).

Всего записей: 458 | Зарегистр. 18-02-2008 | Отправлено: 22:44 17-07-2016
Alukardd



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Taran2ul
Ну тогда единственное на что могу свалить я, это непонятный /system/bin/sh. Мб он чего не умеет.

----------
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 | Отправлено: 23:06 17-07-2016
ASE_DAG



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Alukardd> Мб он чего не умеет
 
Ну перенаправление подоболочки <(), очевидно.  Его вообще мало кто умеет.
 
Taran2ul, перепишите через «трубу» (pipe) — здесь это ничего не сломает.  Ну то есть:
 
find ... |\
    while read f; do
        ...
    done

 
P. S. Откуда у вас там табуляции взялись?  (Мне просто интересно.)
 



SAVage22, как успехи?

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

Всего записей: 9272 | Зарегистр. 12-05-2005 | Отправлено: 23:26 17-07-2016 | Исправлено: ASE_DAG, 23:31 17-07-2016
Taran2ul



Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ASE_DAG
переписал. Спасибо, заработало. Табуляции там вместо пробелов (и чтоб код по вложенности визуально различался) - а это неправильно/нельзя?

Всего записей: 458 | Зарегистр. 18-02-2008 | Отправлено: 00:22 18-07-2016
ASE_DAG



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Taran2ul> спасибо
 
Всегда пожалуйста.
 
> а это неправильно/нельзя?
 
Для отступов — можно, конечно.  И некоторые даже скажут, что нужно.  Другое дело, что это сложно, не всякая программа умеет различать отступы и выравнивание.  Да что там программа — человеку не всегда понятно, где что.  Причем за примерами далеко ходить не надо, вот ровно о чем речь шла:
 
while read f; do
    ...
done < \
     <(...)

 
На второй строчке — понятно, что один отступ.  А что на четвертой?  Один отступ и один пробел для выравнивания или пять пробелов для выравнивания?  И ведь это не вопрос вкуса — на него есть правильный ответ.

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

Всего записей: 9272 | Зарегистр. 12-05-2005 | Отправлено: 00:52 18-07-2016
Alukardd



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ASE_DAG
Цитата:
И ведь это не вопрос вкуса — на него есть правильный ответ.
Не поделитесь ответом? На сколько я помню табуляция имеет важное значение только при использовании HERE DOCUMENTS  в виде <<-

----------
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 | Отправлено: 09:34 18-07-2016 | Исправлено: Alukardd, 09:36 18-07-2016
ASE_DAG



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Alukardd
 
> Не поделитесь ответом?
 
Пять пробелов для выравнивания, разумеется.
 
От обратного: допустим, это отступ и один пробел.  А размер отступа же переменный — задали вы его не в четыре знака, а в три или в восемь — и что теперь подравнивает один пробел?
 
> Насколько я помню, табуляция имеет важное значение только при использовании HERE DOCUMENTS  в виде <<-
 
Ну да, так речь о добровольном выборе табуляций для отступов — почему это сложновато, хотя и красиво.
 
Хотя спасибо за напоминание, почему именно при программировании на Баше стоило бы озаботиться отступами табуляцией.  (Хотя я так и не озаботился.)

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

Всего записей: 9272 | Зарегистр. 12-05-2005 | Отправлено: 19:45 18-07-2016 | Исправлено: ASE_DAG, 19:46 18-07-2016
Alukardd



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ASE_DAG
Я люблю пробелы.
Хотя за табуляцию есть объективное за: каждый ставит её размер так как ему нравится и не надо золиварить о двух или четырёх пробелах.
С другой стороны у табуляции есть минус, который важен для меня, я часто люблю копировать скрипты с экрана(например, после cat'а), а как известно в таком случае все табы превращаются в пробелы и далее если использовать табы, получится мешанина. Так что я сразу использую пробелы (а подравнивать их не приходится руками, т.к. vim далет это сам при expandtab'е).

----------
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 | Отправлено: 19:50 18-07-2016
ASE_DAG



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Alukardd> я часто люблю копировать скрипты с экрана(например, после cat'а), а как известно в таком случае все табы превращаются в пробелы
 
ORLY?

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

Всего записей: 9272 | Зарегистр. 12-05-2005 | Отправлено: 19:55 18-07-2016
Alukardd



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

----------
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 | Отправлено: 00:39 19-07-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