motofan logo
7 страниц V « < 4 5 6 7 >        
> 

Написание скриптов #!/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
Юзер вышелВ друзьяВизиткаП/Я
К началу страницы
+Ответить
VINRARUS
сообщение 12.1.2018, 22:32


Куратор темы

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

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

Рейтинг: 1211



Графическая игра piu-piu на bash. dribble.gif
К сожалению на экране 240х320 дальше меню не запускается. sad.gif
Но на мощном ПК прямо в терминале: делаем на весь экран и любуемся чудесами псевдографики. smile.gif
ПС: там есть бос.

Прикрепленный файл piu-piu.rar   ( 15.45 килобайт ) Кол-во скачиваний: 110
Юзер вышелВ друзьяВизиткаП/Я
К началу страницы
+Ответить
fill.sa
сообщение 2.2.2018, 18:20


Гуру
******

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

Рейтинг: 400



Как зациклить проверку наличия файла с 1 по 9?
На ум приходит что-то такое, но оно неработает
Код
$1=1
while [ ! -f "/file$1" ];
do
echo "file$1"
touch /file$1
$1=$1+1
done


Сообщение отредактировал fill.sa - 2.2.2018, 18:20
Юзер вышелВ друзьяВизиткаП/Я
К началу страницы
+Ответить
VINRARUS
сообщение 2.2.2018, 20:10


Куратор темы

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

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

Рейтинг: 1211



Цитата(fill.sa @ Сегодня, 20:20)
* Как зациклить проверку наличия файла с 1 по 9?

Ну вот, оптимальный код постоянно проверяющий наличие 9 файлов с окончанием из цыфры (цыфры можна заменить любыми символами, или даже словами, в любом количестве), и создающий файл при его отсутствии. Правда смысла этого не понял...
Код
FILE=/tmp/ff
while true
do
  for FU in 1 2 3 4 5 6 7 8 9
  do
    if [ ! -f "$FILE$FU" ]
    then
      echo "create $FILE$FU"
      touch "$FILE$FU"
    fi
  done
  sleep 1
done

Или если нужна проверка токо 1 раз то убираем вечный цыкл:
Код
FILE=/tmp/ff
  for FU in 1 2 3 4 5 6 7 8 9
  do
    if [ ! -f "$FILE$FU" ]
    then
      echo "create $FILE$FU"
      touch "$FILE$FU"
    fi
  done


По поводу твого кода

Не понял логики while [ ! -f "/file$1" ], ведь все равно цыкл лиш 1 раз отработает и закроется так как создаст файл - это равноценно if.

Кто тебя так научил переменные назначать?
$1 так вообще не меняются, лиш при помощи ключей запуска скрипта или функции.
N="значение"
А математические операции (в данном случае +1) делаются так:
Код
N=1
let N=$N+1

или так (POSIX совместимо):
Код
N=1
N=$(($N+1))

или так:
Код
N=1
let N++

[close]
Юзер вышелВ друзьяВизиткаП/Я
К началу страницы
+Ответить
fill.sa
сообщение 2.2.2018, 22:19


Гуру
******

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

Рейтинг: 400



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


Rock The Microphone
********

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


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



Рейтинг: 4654



Цитата(fill.sa @ 3.2.2018, 5:19)
* сишка потихоньку занимает голову ))


Почему бы тогда не сделать на ней? Насколько я помню, там у местного QFile имеется метод exist()

http://doc.qt.io/archives/2.3/qfile.html#900285
Юзер вышелВ друзьяВизиткаП/Я
К началу страницы
+Ответить
fill.sa
сообщение 5.2.2018, 11:02


Гуру
******

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

Рейтинг: 400



EXL,
нужно именно для баша было тогда.
Юзер вышелВ друзьяВизиткаП/Я
К началу страницы
+Ответить
VINRARUS
сообщение 11.3.2018, 16:48


Куратор темы

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

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

Рейтинг: 1211



С интересной проблемой столкнулся: хотел взять терминальный вывод от програмы
Код
curl -k "${url}&signature=${signature}" -C - -o "/tmp/tmp/$name" 2> /tmp/curl.log

записав в файл, но при обработке этого лога не мог понять почему последняя строчка не меняется.
Оказалось curl разделяет последнюю строку не переносами, а символами переноса каретки. shok.gif
Пришлось заменять символ каретки на перенос через tr:
Код
curl -k "${url}&signature=${signature}" -C - -o "/tmp/tmp/$name" 2>&1 | tr -s '\015' '\n' > /tmp/curl.log


Первый раз вижу шобы символ каретки (CR) встречался без символа переноса (LF), обычно там где они встрочаются, в дос подобных ОС, они всегда в паре (CRLF). Это так же глупо выглядит как дверная ручка в бетонной стене. crazy.gif

...но у маководов именно так.

Сообщение отредактировал VINRARUS - 25.9.2021, 9:06
Юзер вышелВ друзьяВизиткаП/Я
К началу страницы
+Ответить
EXL
сообщение 14.3.2018, 18:12


Rock The Microphone
********

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


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



Рейтинг: 4654



VINRARUS,
Похоже на какой-то баг, если честно.
Юзер вышелВ друзьяВизиткаП/Я
К началу страницы
+Ответить
fill.sa
сообщение 16.3.2018, 9:39


Гуру
******

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

Рейтинг: 400



VINRARUS,
ты же любитель баша, тебе может будет интерестно такое задание. Для мода на ауру нужно.
Нужно в UserMenuRegistry в ветку "игры и приложения" добавить свои uuid номера.

Самое главное это как-можно простой и короткой командой сделать чтобы не нагружать систему.
Юзер вышелВ друзьяВизиткаП/Я
К началу страницы
+Ответить
VINRARUS
сообщение 17.3.2018, 14:32


Куратор темы

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

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

Рейтинг: 1211



Я не помню как на Z6, но предположу шо там UserMenuRegistry=UserMenuTree в зине.
Цитата(fill.sa @ Вчера, 11:39)
* Нужно в UserMenuRegistry в ветку "игры и приложения" добавить свои uuid номера.

Это не сложно, можна было и топорно сделать, но вот более грамотно:
Код
JAVA='67dc1191-2928-4938-abce-1a73cb5ce490'
ADD=';11111111-2222-3333-4444-555555555555;66666666-7777-8888-999999999999'
sed -i "/\[$JAVA]/{n;s/\$/;$ADD/;}" /ezxlocal/download/appwrite/am/UserMenuRegistry

Цитата(fill.sa @ Вчера, 11:39)
* Самое главное это как-можно простой и короткой командой сделать чтобы не нагружать систему.

Вот короче, с рандомным uuid:
Код
sed -i "/\[67dc1191-2928-4938-abce-1a73cb5ce490]/{n;s/\$/;`cat /proc/sys/kernel/random/uuid`/;}" /ezxlocal/download/appwrite/am/UserMenuRegistry
Юзер вышелВ друзьяВизиткаП/Я
К началу страницы
+Ответить
VINRARUS
сообщение 26.9.2018, 20:26


Куратор темы

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

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

Рейтинг: 1211



Код
let TIME=07+1
let TIME=08+1

Интересный баг нашол в разных оболочках, 1 команда работает нормально, а 2я ошыбку даёт. pardon.gif Зачем то в шел восьмиричную систему числения запихнули.

Сообщение отредактировал VINRARUS - 26.9.2018, 21:49
Юзер вышелВ друзьяВизиткаП/Я
К началу страницы
+Ответить
EXL
сообщение 26.9.2018, 22:38


Rock The Microphone
********

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


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



Рейтинг: 4654



Цитата(VINRARUS @ Сегодня, 3:26)
* Зачем то в шел восьмиричную систему числения запихнули.


Числа, начинающиеся с 0 всегда были восьмеричные. Соответственно с 0x -- шестнадцатиричные.
Юзер вышелВ друзьяВизиткаП/Я
К началу страницы
+Ответить
igoripp2
сообщение 27.9.2018, 5:05


Новичок
*

Группа: Пользователи
Сообщений: 5
Регистрация: 21.8.2018
Пользователь №: 252 881
Модель телефона: Redmi 5
Прошивка: странная


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



Рейтинг: 0



Цитата(VINRARUS @ 27.9.2018, 2:18) *

Цитата(EXL @ Сегодня, 1:38)
* Числа, начинающиеся с 0 всегда были восьмеричные. Соответственно с 0x -- шестнадцатиричные.

Часто пользуешся? smile.gif

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


Куратор темы

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

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

Рейтинг: 1211



Shell имеет встроеную полезную команду eval: она помогает обходиться без костылей когда например нужно сгенерировать имя переменной (она выполняет любую команду внутри процеса, конешно если команда shell).
Так работать не будет:
Код
AH="UPS"
NUM="10"
$AH$NUM="text"
echo "$UPS10"

А так будет:
Код
AH="UPS"
NUM="10"
eval $AH$NUM="text"
echo "$UPS10"


Добавлено позже (30.9.2018, 3:17):
А ещо я тут понемногу учу shell обходиться без внешних команд. king.gif
Например такой awk:
Код
free | awk '{print $2}

можна заменить чистым шелом:
Код
free | (while read A B C; do echo "$B"; done)


Добавлено позже (30.9.2018, 3:35):
Вот такой немного заменитель sed (даже более) на чистом shell: в файле /home/file.txt ищет токо строчки начинающиеся со слова group, записывает следующее за ним слово в индивидуальную переменную (Большая буква английского алфавита), а ещо в переменную с таким же именем, но с буквой N в конце, записывает номер строки.
Код
SED(){
#bu VINRARUS
N=1
while read S1 S2 S3
do
if [ "$S1" = "group" ]
then
    eval "$1='$S2'"
    eval "${1}N='$N'"
    shift
fi
N=$(($N+1))
done < /home/file.txt
}
SED A B C D E F G Z

Таким способом shell может на порядки быстрее работать если нужно обрабатывать какую то сложную информацию, не страдая от тормозного Linux. dribble.gif

Добавлено позже (30.9.2018, 3:57):
Ну а shift кто не знает сдвигает аргументы на 1 позицыю (после введения команды shift переменная $2 переименовывается в $1, а $3 в $2 и т.д.).

Добавлено позже (30.9.2018, 21:17):
evil_2.gif Пример кошмарной рекурсии, когда переменная пишется сама в себя не зная собственного имени (эта зараза требует тотального экранирования всего шо шевелится, символом \).
Код
TEN=4
for S1 in *
do
eval "eval \"TEXT$TEN='$S1 \$TEXT$TEN'\""
done
echo "$TEXT4"

Демонстрационная програма просто выводит список файлов в обратном порядке, на самом же деле я эту рекурсию использовал в паре с предыдущим кодом. wink.gif

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


Гуру
******

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

Рейтинг: 400



VINRARUS,
смотря какая оболчка, у них же у всех разный набор команд есть. А еще есть всякие экзотические сборки, даже моторолка в sh добавила пару новый команд.
Юзер вышелВ друзьяВизиткаП/Я
К началу страницы
+Ответить
VINRARUS
сообщение 30.9.2018, 13:25


Куратор темы

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

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

Рейтинг: 1211



fill.sa, eval, shift, read это POSIX-совместимые стандартные команды.
Да bash имеет расшыреный read например, но POSIX-совместимый код должет выполняться одинаково везде, включая bash.
Вот let да, не POSIX совместима команда, по этому я стараюсь от неё избавляться.
Юзер вышелВ друзьяВизиткаП/Я
К началу страницы
+Ответить
fill.sa
сообщение 1.10.2018, 5:36


Гуру
******

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

Рейтинг: 400



Цитата(VINRARUS @ Вчера, 14:25)
* но POSIX-совместимый код должет выполняться одинаково везде

по моему посикс не описывает как должен выполняться код, поидее многие проги стараются но не обязательно придерживаются этого стандарта, особенно эзотические, типо бузибокса. Помоему по посиксу даже ключей нету в одно букву, только --kluch.
Хотя у тебя скорее всего собраный типовой bash, тот что и под комп и в нем все тоже будет.
Юзер вышелВ друзьяВизиткаП/Я
К началу страницы
+Ответить
VINRARUS
сообщение 1.10.2018, 19:44


Куратор темы

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

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

Рейтинг: 1211



Цитата(fill.sa @ Сегодня, 8:36)
* по моему посикс не описывает как должен выполняться код

А зачем он тогда нужен по твоему? blink.gif
Цитата(fill.sa @ Сегодня, 8:36)
* поидее многие проги стараются но не обязательно придерживаются этого стандарта

Если прога POSIX не совместима то ею никто для POSIX и использовать не будет.
Цитата(fill.sa @ Сегодня, 8:36)
* Помоему по посиксу даже ключей нету в одно букву, только --kluch.

А по моему наоборот.
Цитата(fill.sa @ Сегодня, 8:36)
* Хотя у тебя скорее всего собраный типовой bash

bash это образец говнокодинга, другими словами пример того как можна всё испортить с шыком. bad.gif
Он не пригоден для сложных програм (из за забагованости, от чего тотально сливает ash, dash, sh по скорости), по моему он и виноват в тотальном переходе на systemD.
bash пригоден для програм аля Hello word или построчного исполнения команд.
А кульминация идиотизма проявляется в системах где /bin/sh ссылается на bash.

Сообщение отредактировал VINRARUS - 1.10.2018, 19:46
Юзер вышелВ друзьяВизиткаП/Я
К началу страницы
+Ответить
EXL
сообщение 2.10.2018, 18:52


Rock The Microphone
********

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


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



Рейтинг: 4654



Цитата(VINRARUS @ 27.9.2018, 3:26)
*
Часто пользуешся?


Так права для файлов smile.gif
Юзер вышелВ друзьяВизиткаП/Я
К началу страницы
+Ответить
VINRARUS
сообщение 18.11.2018, 10:22


Куратор темы

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

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

Рейтинг: 1211



Пример того как на чистом шел прочитать 4ю строчку файла, например файла /proc/meminfo. happy.gif
Номер строки выставляется по количеству "read Z" внутри цыкла, в даном случае их 4.
Код
while true
do
read Z
read Z
read Z
read Z
echo "$Z"
break
done < /proc/meminfo

Код очень эфективен, не требуется арифметических операций подщота номера строк, а после чтения нужной строки он завершается (не читает файл до конца).
Наиболее полезен если нужно читать первые строки. Но если нужна строка номером где то 100+ то он будет очень громоздким (105+ строк кода shok.gif ).
По этому для таких ситуаций более полезен вариант с арифметическим подщотом строк (для примера тут лиш 4, меняется на любое число при том же размере кода):
Код
N=0
until [ "$N" = "4" ]
do
N=$((N+1))
read Z
done < /proc/meminfo
echo "$Z"

ПС: while и until это цыклы, но с обратной логикой (while выполняется пока условие соблюдается, а until наоборот пока оно ошыбочно).
Юзер вышелВ друзьяВизиткаП/Я
К началу страницы
+Ответить
fill.sa
сообщение 18.11.2018, 11:13


Гуру
******

Группа: Разработчики
Сообщений: 1 240
Регистрация: 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 240
Регистрация: 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
********

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


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



Рейтинг: 4654



Цитата(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 240
Регистрация: 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 240
Регистрация: 8.2.2011
Из: Беларусь
Пользователь №: 223 758
Модель телефона: z6 V8
Прошивка: Linux SAedition MOD

Рейтинг: 400



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

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

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


Куратор темы

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

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

Рейтинг: 1211



Цитата(fill.sa @ Сегодня, 14:45)
* Я бы начал с того что у тебя под пк и магикс разные сборки если не версии будут. Вот и по разному работает.

Нет.
Цитата(fill.sa @ Сегодня, 14:45)
* Ну благо тут открытый код, можно негадать и открыть посмотреть как там на самом деле все происходит и главное почему.

Ага, в одном окне открыть код dash, а рядом в другом код Linux... и построчно отследить.
Юзер вышелВ друзьяВизиткаП/Я
К началу страницы
+Ответить
fill.sa
сообщение 9.1.2021, 19:12


Гуру
******

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

Рейтинг: 400



Цитата(VINRARUS @ Сегодня, 14:11)
* Нет.

Ты сам собирал и под магикс и под пк чтоли?
Юзер вышелВ друзьяВизиткаП/Я
К началу страницы
+Ответить
VINRARUS
сообщение 9.1.2021, 20:53


Куратор темы

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

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

Рейтинг: 1211



Цитата(fill.sa @ Сегодня, 21:12)
* Ты сам собирал и под магикс и под пк чтоли?

Да. blind.gif Потому шо.

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


Гуру
******

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

Рейтинг: 400



VINRARUS,
А зачем дебиановский пакет под сусю собирал? Чем ванильная версия плоха? Или сусевская версия если есть.
Юзер вышелВ друзьяВизиткаП/Я
К началу страницы
+Ответить
VINRARUS
сообщение 10.1.2021, 11:12


Куратор темы

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

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

Рейтинг: 1211



fill.sa, смотри 2ю ссылку, там всё описано. grin.gif

Добавлено позже (10.1.2021, 14:47):
ПС: куда уж ванильнее Дебиановской. wink.gif

Сообщение отредактировал VINRARUS - 10.1.2021, 11:13
Юзер вышелВ друзьяВизиткаП/Я
К началу страницы
+Ответить
EXL
сообщение 25.9.2021, 5:05


Rock The Microphone
********

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


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



Рейтинг: 4654



VINRARUS, fill.sa,
Я плохо знаю Shell, но может кто поможет, суть в том, что есть такая вот тестовая директория:

Код
$ ls -l ~/Downloads/test/
total 0
-rw-rw-r--. 1 exl exl 0 Sep 25 11:52 'file name.tar.gz'
-rw-rw-r--. 1 exl exl 0 Sep 25 11:52  filename.tar.gz
-rw-rw-r--. 1 exl exl 0 Sep 25 11:55  namefile.tar.gz

И есть вот такой однострочник, который отлично отрабатывает если в имени файла нет пробела:

Код
find ~/Downloads/test -type f -name "*.tar*" | xargs -n1 sh -c 'echo $0 `basename $0 | sed -E 's/\.tar//g'`'

Но если в имени файла имеется пробел, он лажает:

Код
$ find ~/Downloads/test -type f -name "*.tar*" | xargs -n1 sh -c 'echo $0 `basename $0 | sed -E 's/\.tar//g'`'
/home/exl/Downloads/test/filename.tar.gz filename.gz  # Тут всё отлично
/home/exl/Downloads/test/namefile.tar.gz namefile.gz  # Тут всё отлично
/home/exl/Downloads/test/file file                    # Тут начинается лажа
name.tar.gz name.gz

Как мне правильно заэкранировать эти пробелы? Пробовал оборачивать $0 в кавычки "$0" -- не помогает.

ps.gif Однострочник должен выполнянться в окружении MotoMAGX-телефонов на стандартных прошивках, поэтому последние навороты GNU Bash и прочих могут не сработать.
Юзер вышелВ друзьяВизиткаП/Я
К началу страницы
+Ответить
VINRARUS
сообщение 25.9.2021, 11:22


Куратор темы

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

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

Рейтинг: 1211



Цитата(EXL @ Сегодня, 8:05)
* $ find ~/Downloads/test -type f -name "*.tar*" | xargs -n1 sh -c 'echo $0 `basename $0 | sed -E 's/\.tar//g'`'

Ну начнём с ошыбок
я всегда с них начинаюИзображение
Код
'echo $0 `basename $0 | sed -E 's/\.tar//g'`'

Тут одинарныє кавычки нейтрализуют наклонные кавычки, а так как там 2 пары одинарных кавычок то команда логически разбивается на 3 части:
Код
'echo $0 `basename $0 | sed -E '
s/\.tar//g
'`'

Нада использовать двойные кавычки для sed, ну и заодно для basename 1м аргументом давать путь, а ещо уберём ненужный для 1 фильтра -E:
Код
'echo $0 `basename "$0" | sed "s/\.tar//g"`'

В даном случае баг не проявится, но если вместо ".tar" будет шото с пробелом то конструкцыя рассыпится по пробелах, а вот для basename проявился бы баг, если бы вначале не проявился.
А ещо
Код
sed "s/\\.tar//g"

опасно применять, так как имя файла file.tar.name.tar.gz будет изуродовано. Лучше изменить токо конечный кусок:
Код
sed "s/\\.tar\.gz\$/.gz/"

так надёжнее, тоже можна и для find применить. Конешно если токо tar.gz интересуют.
[close]

Цитата(EXL @ Сегодня, 8:05)
* Но если в имени файла имеется пробел, он лажает

Лажает именно xargs, он хочет кавычками отделённый ввод, а не строками:
Код
find ./ -type f -name "*.tar.gz" | sed -e 's/^/"/' -e 's/$/"/' | xargs -n1 sh -c 'echo $0 `basename "$0" | sed "s/\\.tar\.gz\$/.gz/"`'

Юзер вышелВ друзьяВизиткаП/Я
К началу страницы
+Ответить
EXL
сообщение 25.9.2021, 11:46


Rock The Microphone
********

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


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



Рейтинг: 4654



Цитата(VINRARUS @ Сегодня, 18:22)
* Лажает именно xargs, он хочет кавычками отделённый ввод, а не строками:

Спасибо! Посмотри пожалуйста, есть ли в xargs на MotoMAGX возможность использования такой штуки, как -d '\n'? Тогда по идее xargs лажать не будет и однострочник можно сократить до:

Код
find ~/Downloads/test -type f -name "*.tar*" | xargs -d '\n' -n1 sh -c 'echo "$0" `basename "$0" | sed "s/\\.tar\.gz\$/.gz/"`'

Юзер вышелВ друзьяВизиткаП/Я
К началу страницы
+Ответить
VINRARUS
сообщение 25.9.2021, 13:44


Куратор темы

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

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

Рейтинг: 1211



Цитата(EXL @ Сегодня, 14:46)
* Посмотри пожалуйста, есть ли в xargs на MotoMAGX возможность использования такой штуки, как -d '\n'?

Пф, канешно жэ
Н Е Т Изображение
[close]

На тебе "однострочник" без мучений с утилитами:
Код
find ./ -type f -name "*.tar*" | while read FILE; do F1="${FILE%.tar*}"; F2="${FILE##*.tar}"; echo "$FILE ${F1##*/}$F2"; done

wink.gif
Юзер вышелВ друзьяВизиткаП/Я
К началу страницы
+Ответить
EXL
сообщение 25.9.2021, 14:52


Rock The Microphone
********

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


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



Рейтинг: 4654



VINRARUS,
И xargs -0 тоже нельзя? shok.gif

Цитата(VINRARUS @ Сегодня, 20:44)
* На тебе "однострочник" без мучений с утилитами:

На MotoMAGX он нормально на дефолтном Shell отработает? Если да, сделай ещё пожалуйста для такого варианта:

Код
$ find ~/Download/test -type f -name "*.gz*" | xargs -d '\n' -n1 sh -c 'echo "$0" `basename "$0" .gz`'
/home/exl/Downloads/test/filename.tar.gz filename.tar
/home/exl/Downloads/test/namefile.tar.gz namefile.tar
/home/exl/Downloads/test/file name.tar.gz file name.tar

То есть откидываем последнее расширение.

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

7 страниц V « < 4 5 6 7 >
Ответ в темуСоздание новой темы
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0

 



Текстовая версия Сейчас: 14.6.2025, 4:19

Форум живёт: