motofan logo
26 страниц V « < 21 22 23 24 25 > »         
> 

Написание скриптов #!/bin/sh for UNIX, Кто поможет?

VINRARUS
сообщение 17.6.2011, 17:56 Закрепленное сообщение!


Куратор темы

Термоядерный
********

Группа: Пользователи
Сообщений: 3 496
Регистрация: 12.12.2009
Из: Чорнобиль
Пользователь №: 211 044

Рейтинг: 1211



Ура! В теме появилася шапочка. watsup.gif
В даной теме помогаем друг другу в написании шелл скриптов, и дружно решаем проблемы связанные с ними smile.gif

Вот мои рукописные мануалы для совсем новичков:
Основы. Синтаксис, кавычки, переменные, условные операторы
Розширенная инфа о if

Подробный мануал с примерами по ВСЕМ функциям SH
Портативная версия еще одного мануала
Книги в формате Djvu

Примеры работы с текстом через sed и мануал PRO и мануал NUB
Примеры работы с текстом через awk и мануал
Обрезка текста внутри переменных - чорт ногу сломит =] О логике шаблонов.

Где быстро найти инфу?
Тут вводите в строчку поиска манов любую утилиту, например echo, и 95% вероятности что получите инфу по всем функциям и ключам
Вот инфа по НЕКОТОРЫМ утилитам, также можна пользоваться поиском

ПС

1. Не во всех UNIX\LINUX системах можно сразу в терминале вводить команды утилит.
Например в MOTOMAGX часто перед командой утилиты нужно вводить "busybox" (например busybox free) хотя это и решено на некоторых модах.
А в некоторых выкидышах типа Android они и вовсе отсутствуют как и сам busybox, но есть возможность добавить его самому.

2. Не всегда утилиты поддерживают то что написано в манах к ним, иногда функционал меняется от версии к версии.

3. Также нужно знать что код от bash иногда может не работать корректно на shell (sh), хотя и очень редко.
Это из за того что древним программистам делать было нечего, когда не было еще интернета, и они понапридумывали кучу модификаций.
Хорошо хоть код под чистый shell подойдет ко всем им, из за чего он считается эталоном. smile.gif
А не bash как считают юные линуксойды.
[close]


Сообщение отредактировал VINRARUS - 12.12.2020, 21:32
Юзер вышелВ друзьяВизиткаП/Я
К началу страницы
+Ответить
fill.sa
сообщение 18.11.2018, 11:13


Гуру
******

Группа: Разработчики
Сообщений: 1 226
Регистрация: 8.2.2011
Из: Беларусь
Пользователь №: 223 758
Модель телефона: z6 V8
Прошивка: Linux SAedition MOD

Рейтинг: 400



Цитата(VINRARUS @ Сегодня, 11:22)
* while

А рзаве циклы не тяжеловесные задачи?
Юзер вышелВ друзьяВизиткаП/Я
К началу страницы
+Ответить
VINRARUS
сообщение 18.11.2018, 14:59


Куратор темы

Термоядерный
********

Группа: Пользователи
Сообщений: 3 496
Регистрация: 12.12.2009
Из: Чорнобиль
Пользователь №: 211 044

Рейтинг: 1211



Цитата(fill.sa @ Сегодня, 14:13)
* А рзаве циклы не тяжеловесные задачи?

Кажутся тяжолыми при вызове внешних команд внутри цыкла без интервалов. В даном случае цыкл срабатывает определенное количество раз и отработает быстрее чем запустится некоторый натив, особенно без порождения нового процеса.
Юзер вышелВ друзьяВизиткаП/Я
К началу страницы
+Ответить
VINRARUS
сообщение 23.12.2018, 21:05


Куратор темы

Термоядерный
********

Группа: Пользователи
Сообщений: 3 496
Регистрация: 12.12.2009
Из: Чорнобиль
Пользователь №: 211 044

Рейтинг: 1211



Ещо один пример оптимизации shell кода при котором можна ускорить обработку простых условий почти на порядок. thumbup.gif
Для этого достаточно вместо if использовать конструкцию case. Хотя обе команды внутренние и сильно отличаются по функционалу тем не менее для простых условий типа "если N=1 то єто, если N=2 значит то, а если шото другое то хз" case будет не токо быстрее, но и удобнее.

Вот можете сравнить время выполнения аналогичных зацыкленых условий.
IF
Код
N=
read UP1 < /proc/uptime
while true
do
if [ "$N" = "" ]
then
N=1
elif [ "$N" = "a" ]
then
echo re
elif [ "$N" = "b" ]
then
echo re
elif [ "$N" = "c" ]
then
echo re
elif [ "$N" = "d" ]
then
echo re
elif [ "$N" = "e" ]
then
echo re
elif [ "$N" = "f" ]
then
echo re
elif [ "$N" = "g" ]
then
echo repo
elif [ "$N" = "h" ]
then
echo re
elif [ "$N" = "i" ]
then
echo re
elif [ "$N" = "1000000" ]
then
echo END
break
else
N=$((N+1))
fi
done
read UP2 < /proc/uptime
echo "$((${UP2%%.*}-${UP1%%.*})) sec"
[close]

CASE
Код
N=
read UP1 < /proc/uptime
while true
do
case "$N" in
"")
N=1
;;
a)
echo re
;;
b)
echo re
;;
c)
echo re
;;
d)
echo re
;;
e)
echo re
;;
f)
echo re
;;
g)
echo re
;;
h)
echo redi
;;
i)
echo re
;;
1000000)
echo re
echo END
break
;;
*)
N=$((N+1))
;;
esac
done
read UP2 < /proc/uptime
echo "$((${UP2%%.*}-${UP1%%.*})) sec"
[close]
Юзер вышелВ друзьяВизиткаП/Я
К началу страницы
+Ответить
fill.sa
сообщение 26.1.2019, 23:10


Гуру
******

Группа: Разработчики
Сообщений: 1 226
Регистрация: 8.2.2011
Из: Беларусь
Пользователь №: 223 758
Модель телефона: z6 V8
Прошивка: Linux SAedition MOD

Рейтинг: 400



VINRARUS,
подключайся к процессу.
Вообщем давно было интересно чем же отличаются между собой прошивки да и прошивки для рахных телов в целом. И я уже как-то выкладывал сравнение между разными файлами.

Теперь, как EXL выложил способ разасэмбливать elf файлы, можно заглянуть и внутрь файлов и посмотреть какие новые функции или методы появились на новых прошах(особенно у ZN5_7FR).

Конечноже по одному файлу смотреть не будешь и нужно все автомотизировать. Пока на ум приходит такая вот карусель
Код
find  -type f  -exec sh -c 'mkdir -p /sdk_my/`dirname $@`; readelf -W -s $@ | awk '{ if( $2 ) print $8 "\t\t // " $4 "bind:" $5}' | c++filt > /sdk_my/`dirname $@`/`basename $@`' sh {} \;

Но есть проблемы с экранированием и ругается на awk '{ if( $2 ), без этого в целом все работает.
Второй вопрос как по ходу дела вычлинять именно elf файлы, дабы не трогать другие файлы.
И третье, это отсеивать ссылки, а то будет много повторов техже самых библиотек.

Сообщение отредактировал fill.sa - 26.1.2019, 23:13
Юзер вышелВ друзьяВизиткаП/Я
К началу страницы
+Ответить
EXL
сообщение 31.1.2019, 3:13


Rock The Microphone
********

Группа: Администраторы
Сообщений: 2 872
Регистрация: 12.5.2007
Из: г. Новосибирск
Пользователь №: 134 652
Модель телефона: XT894 / XT897
Прошивка: Различные


Настроение:
null



Рейтинг: 4600



Цитата(fill.sa @ 27.1.2019, 6:10)
* Второй вопрос как по ходу дела вычлинять именно elf файлы, дабы не трогать другие файлы.


Попробуй что-нибудь из:

Код
find $WHERE -type f -exec hexdump -n 4 -e '4/1 "%2x" " {}\n"'  {} \; | grep ^7f454c46
find $WHERE -type f -exec head -c 4 {} \; -exec echo " {}" \;  | grep ^.ELF
find $WHERE -type f -exec sh -c "file {} | grep -Pi ': elf (32|64)-bit' > /dev/null" \; -print
Юзер вышелВ друзьяВизиткаП/Я
К началу страницы
+Ответить
VINRARUS
сообщение 3.2.2019, 23:10


Куратор темы

Термоядерный
********

Группа: Пользователи
Сообщений: 3 496
Регистрация: 12.12.2009
Из: Чорнобиль
Пользователь №: 211 044

Рейтинг: 1211



Цитата(fill.sa @ 27.1.2019, 2:10) *

Теперь, как EXL выложил способ разасэмбливать elf файлы, можно заглянуть и внутрь файлов и посмотреть какие новые функции или методы появились на новых прошах(особенно у ZN5_7FR).
Конечноже по одному файлу смотреть не будешь и нужно все автомотизировать. Пока на ум приходит такая вот карусель
Второй вопрос как по ходу дела вычлинять именно elf файлы, дабы не трогать другие файлы.
И третье, это отсеивать ссылки, а то будет много повторов техже самых библиотек.

Извиняюсь за паузу, был сильно занят. blind.gif
Вот, переходим в папку в которой нада пересмотреть файлы, выполняем скрипт:
Код
#!/bin/sh
#bu_VINRARUS 2019
SPASE="#"
DIRKA=
LOGS="$PWD/../FIND_in_${PWD##*/}"
mkdir "$LOGS"
FINDER(){
    Z=
    echo "in: $PWD"
    for Z in *
    do
    if [ -h "$Z" ]
    then
        echo "ignore link: $Z"
    elif [ -d "$Z" ]
    then
        DIRKA="$DIRKA$SPASE$Z"
        cd "$Z"
        FINDER
        cd ..
        DIRKA="${DIRKA%$SPASE*}"
    elif [ -f "$Z" ]
    then
        DO
    fi
    done
}
DO(){
    echo "read: $Z"
    READ=`readelf -W -s "$Z"`
    if [ "$?" = "0" ]
    then
        echo "$READ" > "$LOGS/$DIRKA$SPASE$Z.log"
    fi
}
FINDER

В папке на уровень выше создаётся папка "FIND_in_(имя папки)" со всеми удачными чтениями команды readelf во всех настоящих подпапках и файлах.
Имя этих файлов содержыт относительный путь шо очень удобно для сравнения в лоб разных версий прошывок в автоматическом режыме (банально контрольной сумой проверяем одинаковые ли файлы, если разные то сравниваем построчно, или какая там суть читающего эльфийца).

Добавлено позже (4.2.2019, 2:15):
Другими словами тут аналог find на шеле, со всеми возможностями шела, а главное с контролируемой логикой. dribble.gif
И нечего страдать головой, грипом или айкать борясь с ветром. grin.gif

Сообщение отредактировал VINRARUS - 3.2.2019, 23:19
Юзер вышелВ друзьяВизиткаП/Я
К началу страницы
+Ответить
VINRARUS
сообщение 28.5.2019, 19:57


Куратор темы

Термоядерный
********

Группа: Пользователи
Сообщений: 3 496
Регистрация: 12.12.2009
Из: Чорнобиль
Пользователь №: 211 044

Рейтинг: 1211



Код
PIDOF(){
    PIDOF=
    for PIPI in /proc/[0-9]*
    do
    read W V < $PIPI/status
    case "$V" in
    $1)
        PIDOF="${PIPI##*/} $PIDOF"
   ;;
    esac
    done
    V=
    W=
    echo "$PIDOF"
}
PIDOF [process name]

Вот реализовал внешнюю команду pidoff (выводит номер процеса по названию) силами shell. smile.gif

Отличный инструмент в умелых руках, можна управлять процесами (ведь команда kill тоже внутренняя в shell) и смотреть о них инфу не покидая пределы shell процеса, быстрее чем через внешние команды.
Даже такая простая функция уже поддержывает шаблоны названий типа PIDOF "s*", а с модификацией вообще не имеет ограничений под любую задачу.
Юзер вышелВ друзьяВизиткаП/Я
К началу страницы
+Ответить
fill.sa
сообщение 30.5.2019, 9:41


Гуру
******

Группа: Разработчики
Сообщений: 1 226
Регистрация: 8.2.2011
Из: Беларусь
Пользователь №: 223 758
Модель телефона: z6 V8
Прошивка: Linux SAedition MOD

Рейтинг: 400



VINRARUS,
сомневаюсь что лучше, чем через комнады из бузибокса.
Юзер вышелВ друзьяВизиткаП/Я
К началу страницы
+Ответить
VINRARUS
сообщение 5.12.2020, 15:55


Куратор темы

Термоядерный
********

Группа: Пользователи
Сообщений: 3 496
Регистрация: 12.12.2009
Из: Чорнобиль
Пользователь №: 211 044

Рейтинг: 1211



Цитата(VINRARUS @ 1.1.2019, 16:19)
* А вот в dash работает на зине, к стати вот он (всё ещо значительно быстрее родного ash):

Столкнулся с неприятным багом в dash-0.5.10 при выполнении подобной конструкцыи:
Код
#!/bin/dash
date +%S
sleep 10 &
sleep 3
date +%S

dash имеет "фичу" pig.gif запущеных фоновых процесов через "&", которая выводит сообщение о завершении фонового процеса, при чом не сразу после завершения, а токо после завершения и последующего обновления ожыдания ввода.
Цитата
[1] + Done


На Linux 5.9 видим такой результат (после обновления строки вода кнопкой ENTER):
Цитата
$ date +%S
sleep 10 &
sleep 3
date +%S
08
[1] + Done sleep 10
$ $ $ 11

А на Linux 2.6.10 (ZN5) видим такую глупость:
Цитата
#date +%S
sleep 10 &
sleep 3
date +%S
07
##[1] + Done sleep 10
#17
#

Тоесть оно подождало нужные 3 сек, а потом подождало ненужный фоновый процес (+7 сек) и токо потом приступило к следующей команде. no2.gif Как будто я его просил "wait" использовать.
Вот к чему приводит лишняя "функцыональность" и плохая забота о обратной совместимости. chebu.gif
Харашо шо решается просто:
Код
#!/bin/dash
date +%S
(sleep 10 &)
sleep 3
date +%S

...но настроение испортило. this.gif

Сообщение отредактировал VINRARUS - 5.12.2020, 16:00
Юзер вышелВ друзьяВизиткаП/Я
К началу страницы
+Ответить
fill.sa
сообщение 9.1.2021, 12:45


Гуру
******

Группа: Разработчики
Сообщений: 1 226
Регистрация: 8.2.2011
Из: Беларусь
Пользователь №: 223 758
Модель телефона: z6 V8
Прошивка: Linux SAedition MOD

Рейтинг: 400



Я бы начал с того что у тебя под пк и магикс разные сборки если не версии будут. Вот и по разному работает.

Цитата(VINRARUS @ 5.12.2020, 16:55)
* Тоесть оно подождало нужные 3 сек, а потом подождало ненужный фоновый процес (+7 сек) и токо потом приступило к следующей команде.

Ну благо тут открытый код, можно негадать и открыть посмотреть как там на самом деле все происходит и главное почему.
Юзер вышелВ друзьяВизиткаП/Я
К началу страницы
+Ответить
Написание скриптов #!/bin/sh for UNIX, Кто поможет? · Motorola на Linux OS · Forum
 

26 страниц V « < 21 22 23 24 25 > » 
Ответ в темуСоздание новой темы
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 



Текстовая версия Сейчас: 28.3.2024, 16:17

Форум живёт: