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
Юзер вышелВ друзьяВизиткаП/Я
К началу страницы
+Ответить
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 145
Регистрация: 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 145
Регистрация: 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 145
Регистрация: 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 145
Регистрация: 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 145
Регистрация: 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 145
Регистрация: 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 145
Регистрация: 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 145
Регистрация: 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 145
Регистрация: 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
Юзер вышелВ друзьяВизиткаП/Я
К началу страницы
+Ответить
EXL
сообщение 10.10.2021, 16:41


Rock The Microphone
********

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


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



Рейтинг: 4654



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

wink.gif

Кстати, я правильное понимаю, что если вместо echo в этом однострочнике будет использоваться утилита, которая принимает на вход два аргумента, а не строку, по типу ./app <arg1> <arg2>, то нужно будет сделать так?

Код
echo "$FILE" "${F1##*/}$F2"
Юзер вышелВ друзьяВизиткаП/Я
К началу страницы
+Ответить
VINRARUS
сообщение 10.10.2021, 16:59


Куратор темы

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

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

Рейтинг: 1211



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


Куратор темы

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

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

Рейтинг: 1211



shell функцыя имитирующая awk '{print $4}' (тоесть выводит номер столбца в строке разделённой пробелами (разделители в переменной TAB настраиваются)), но в отличии от отдельной утилиты срабатывает намного шустрее внутри shell програмы.
В переменную $AWK выводится столбец указаного номера, а в $GAWK начиная от указаного номера до конца (например для ls полезно, когда имена могут иметь пробелы).
Код
#!/bin/sh
AWK(){
#bu VINRARUS
#use: AWK "V I N R A R U S" 4
#out in $AWK and $GAWK
TAB=" "
N=1
AWK="$1 "
until [ "$N" = "$2" ]
do
    AWK="${AWK#*$TAB}"
    GAWK="${AWK#$TAB}"
    until [ "$AWK" = "$GAWK" ]
    do
        AWK="$GAWK"
        GAWK="${AWK#$TAB}"
    done
    N="$((N+1))"
done
GAWK="${GAWK%%$TAB}"
AWK="${AWK%%$TAB*}"
}

Примеры использования:
Цитата
AWK "V I N R A R U S" 4
echo "$AWK"
#R
echo "$GAWK"
R A R U S

Так например можна узнать размер файла в shell:
Цитата
INFO=`ls -l /file.txt`
AWK "$INFO" 5
echo "$AWK"
#1234
AWK "$INFO" 9
echo "$GAWK"
#file.txt

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

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

 



Текстовая версия Сейчас: 16.7.2025, 6:03

Форум живёт: