motofan logo
7 страниц V « < 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
сообщение 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 144
Регистрация: 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 144
Регистрация: 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 144
Регистрация: 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 144
Регистрация: 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 144
Регистрация: 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 144
Регистрация: 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?
Юзер вышелВ друзьяВизиткаП/Я
К началу страницы
+Ответить
VINRARUS
сообщение 25.9.2021, 22:25


Куратор темы

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

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

Рейтинг: 1211



Цитата(EXL @ Сегодня, 17:52)
* На MotoMAGX он нормально на дефолтном Shell отработает?

Да.
Цитата(EXL @ Сегодня, 17:52)
* Если да

ДА! smile.gif
Цитата(EXL @ Сегодня, 17:52)
* То есть откидываем последнее расширение.

Не, ну это элементарно:
Код
find ./ -type f -name "*.tar*" | while read FILE; do F="${FILE%.*}"; echo "$FILE ${F##*/}"; done

Цитата(EXL @ Сегодня, 17:52)
* А какой на MotoMAGX дефолтный Shell? Ash?

Он, с мотопатчем каким то.

Добавлено позже (26.9.2021, 1:27):
Цитата(EXL @ Вчера, 17:52)
* И xargs -0 тоже нельзя?

blind.gif Вроде можна:
Код
Mobilinux(TM) 4.1, Linux/armv6l 2.6.10_dev
MotoMAGX: LinuxJava 6.3, ZiniMOD beta 2
01:26:17 <_<
# xargs -help
xargs: invalid option -- h
BusyBox v1.01 (---) multi-call binary

Usage: xargs [COMMAND] [OPTIONS] [ARGS...]

Executes COMMAND on every item given by standard input.

Options:
        -r      Do not run command for empty readed lines
        -x      Exit if the size is exceeded
        -0      Input filenames are terminated by a null character
        -t      Print the command line on stderr before executing it.
Юзер вышелВ друзьяВизиткаП/Я
К началу страницы
+Ответить
EXL
сообщение 26.9.2021, 5:29


Rock The Microphone
********

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


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



Рейтинг: 4654



VINRARUS,
Спасибо!

Цитата(VINRARUS @ Сегодня, 5:25)
* Он, с мотопатчем каким то.

Этот ash похоже входит в состав BusyBox?

Цитата(VINRARUS @ Сегодня, 5:25)
* blind.gif Вроде можна:

О, интересно! Тогда это должно работать?

Код

$ find ~/Downloads/test -type f -name "*.gz*" -print0 | xargs -0 -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

$ find ~/Downloads/test/ -type f -name "*.tar*" -print0 | xargs -0 -n1 sh -c 'echo "$0" `basename "$0" | sed "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 name.tar.gz file name.gz

Осталось только узнать, есть ли параметр -print0 у find или busybox find в MotoMAGX grin.gif
Юзер вышелВ друзьяВизиткаП/Я
К началу страницы
+Ответить
VINRARUS
сообщение 26.9.2021, 9:41


Куратор темы

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

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

Рейтинг: 1211



Цитата(EXL @ Сегодня, 8:29)
* Этот ash похоже входит в состав BusyBox?

Да.
Код
  Mobilinux(TM) 4.1, Linux/armv6l 2.6.10_dev
MotoMAGX: LinuxJava 6.3, ZiniMOD beta 2
12:41:56 x_x
# busybox
BusyBox v1.01 (---) multi-call binary

Usage: busybox [function] [arguments]...
   or: [function] [arguments]...

        BusyBox is a multi-call binary that combines many common Unix
        utilities into a single executable.  Most people will create a
        link to busybox for each function they wish to use and BusyBox
        will act like whatever it was invoked as!

Currently defined functions:
        [, addgroup, adduser, arping, ash, awk, basename, bunzip2, busybox, bzcat, cat, chgrp, chmod, chown, chroot, chvt, clear, cmp, cp, cpio,
        crond, crontab, cut, date, dc, dd, deallocvt, delgroup, deluser, devfsd, df, dirname, dmesg, dos2unix, du, dumpleases, echo, egrep, env,
        expr, false, fbset, fdisk, fgrep, find, fold, free, ftpget, ftpput, getty, grep, gunzip, gzip, halt, hdparm, head, hexdump, hostid, hostname,
        httpd, hwclock, id, ifconfig, ifdown, ifup, inetd, init, insmod, install, ip, ipaddr, ipcalc, iplink, iproute, iptunnel, kill, killall,
        klogd, last, length, linuxrc, ln, loadkmap, logger, login, logname, losetup, ls, lsmod, makedevs, md5sum, mesg, mkdir, mkfifo, mknod,
        mkswap, mktemp, modprobe, more, mount, mt, mv, nameif, nc, netstat, nslookup, od, openvt, passwd, patch, pidof, ping, ping6, pivot_root,
        poweroff, printf, ps, pwd, rdate, readlink, realpath, reboot, renice, reset, rm, rmdir, rmmod, route, rpm2cpio, run-parts, rx, sed, seq,
        sh, sha1sum, sleep, sort, start-stop-daemon, strings, stty, su, sulogin, swapoff, swapon, sync, sysctl, syslogd, tail, tar, tee, telnet,
        telnetd, test, tftp, time, top, touch, tr, traceroute, true, tty, udhcpc, udhcpd, umount, uname, uniq, unix2dos, unzip, uptime, usleep,
        uudecode, uuencode, vconfig, vi, vlock, watch, wc, wget, which, who, whoami, xargs, yes, zcat
[close]

Цитата(EXL @ Сегодня, 8:29)
* Осталось только узнать, есть ли параметр -print0 у find или busybox find в MotoMAGX

Нет.
Код
# find --help
BusyBox v1.01 (---) multi-call binary

Usage: find [PATH...] [EXPRESSION]

Search for files in a directory hierarchy.  The default PATH is
the current directory; default EXPRESSION is '-print'

EXPRESSION may consist of:
        -follow         Dereference symbolic links.
        -name PATTERN   File name (leading directories removed) matches PATTERN.
        -print          Print (default and assumed).

        -type X         Filetype matches X (where X is one of: f,d,l,b,c,...)
        -perm PERMS     Permissions match any of (+NNN); all of (-NNN);
                        or exactly (NNN)
        -mtime TIME     Modified time is greater than (+N); less than (-N);
                        or exactly (N) days

ps.gif А чего ты хоч достичь?

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


Rock The Microphone
********

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


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



Рейтинг: 4654



Цитата(VINRARUS @ Сегодня, 16:41)
* Нет

Ясно, спасибо! Тогда заюзаю твои команды.

Цитата(VINRARUS @ Сегодня, 16:41)
* ps.gif А чего ты хоч достичь?

Да немного облегчаю себе жизнь biggrin.gif
Юзер вышелВ друзьяВизиткаП/Я
К началу страницы
+Ответить
EXL
сообщение 3.10.2021, 22:07


Rock The Microphone
********

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


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



Рейтинг: 4654



VINRARUS,
А на MotoMAGX-телефонах вроде Z6 и ZN5 команда pidof доступна из коробки, или нужно её запускать типа busybox pidof как какой-нибудь tar?
Юзер вышелВ друзьяВизиткаП/Я
К началу страницы
+Ответить
VINRARUS
сообщение 9.10.2021, 14:13


Куратор темы

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

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

Рейтинг: 1211



EXL, ну судя по не меняющемся щотчике pid команда pidof это часть ash, то есть в скрипте не рождает новый процес, так как есть внутренней утилитой.
Но из под натива желательно через busybox pidof запускать, если не из под ash.

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


Rock The Microphone
********

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


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



Рейтинг: 4654



VINRARUS,
Спасибо, я изначально сделал через busybox на всякий случай, но облажался подставив в команду полный путь вместо обычного имени программы, тут расписал этот случай: Софт для ZN5 и прочих MotoMAGX: MGX и PEP.

А получилось так потому что на старом ноуте под Fedora 33 команда:

Код
busybox pidof -s /usr/lib64/firefox/firefox
239377

Работала отлично. Тогда как на MotoMAGX если подставить полный путь, то pidof ничего не выдаст:

Код
# busybox pidof -s /usr/SYSqtapp/phone/phone

# busybox pidof -s phone
1108

И ещё, кстати, внутренняя pidof функция ash игнорирует параметр -s:
Код
# pidof phone
1108 1124 1201
# pidof -s phone
1108 1124 1201
# busybox pidof phone  
1108 1124 1201
# busybox pidof -s phone
1108

Тогда как на "большом брате" таких приколов нет, но видимо потому что там Bash.
Юзер вышелВ друзьяВизиткаП/Я
К началу страницы
+Ответить
VINRARUS
сообщение 9.10.2021, 16:45


Куратор темы

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

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

Рейтинг: 1211



Цитата(EXL @ Сегодня, 19:22)
* Тогда как на "большом брате" таких приколов нет, но видимо потому что там Bash.

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


Rock The Microphone
********

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


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



Рейтинг: 4654



Цитата(VINRARUS @ Сегодня, 23:45)
* В Bash нет встроеного pidof, оно внешнее. wink.gif

Точно, в пакет procps-ng входит.
Код
$ rpm -qf /usr/bin/pidof
procps-ng-3.3.16-2.fc33.x86_64
Юзер вышелВ друзьяВизиткаП/Я
К началу страницы
+Ответить
VINRARUS
сообщение 9.10.2021, 17:14


Куратор темы

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

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

Рейтинг: 1211



EXL, так быстро проверяется:
Код
ps; pidof; ps

Если pid 2х ps на 1 отличается значит команда внутренняя, а если на 2 то скорее всего внешняя. smile.gif

Сообщение отредактировал VINRARUS - 10.10.2021, 7:00
Юзер вышелВ друзьяВизиткаП/Я
К началу страницы
+Ответить
Написание скриптов #!/bin/sh for UNIX, Кто поможет? · Motorola на Linux OS · Forum
 

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

 



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

Форум живёт: