1.1, ABATAPA (ok), 18:44, 27/02/2022 [ответить] [﹢﹢﹢] [ · · · ]
| +15 +/– |
Привер того, как нельзя делать: переменные без кавычек, вызов внешних программ с простой передачей им "голых" переменных (которые подставляются в exec), двойное раскодирование (сперва "тест", потом основное) вместо обработки кодов возврата...
Корявый скрипт новичка.
| |
1.2, Аноним (2), 20:45, 28/02/2022 [ответить] [﹢﹢﹢] [ · · · ]
| +7 +/– |
соглашусь с предыдущим оратором. Автор, вбей свой скрипт в shellcheck.
> Скрипт для конвертации архива gz в lzma
что за задачка такая странная? Зачем это вообще нужно?
> echo
printf
> if условие; then
> практически весь скрипт
> else
> какой-то однострочный пустяк
> fi
просто проверь в самом начале на плохое условие и сделай ранний выход. Зачем весь скрипт помещать внутрь гигантского ифа?
> /usr/bin
не понимать, зачем универсальному кросс-дистровому скрипту хардкодить пути к бинарям. А если я захочу переопределить $PATH?
> CopyLeft (L)
Что за лицензия такая?
> echo error: no input file $F or $F.gz
> exit 1
почему ошибки идут в stdout, а не в stderr?
где стандартная преамбула, врубающая строгий режим? типа
set -euo pipefail
shopt -s inherit_errexit
почему у переменных однобуквенные названия? да ты и сам спустя месяц забудешь, что они значат
> if [ -f $F.gz ]
че за бред, это не единственная IO-ошибка, которая может возникнуть. Об этих ошибках должна рапортовать вызываемая прога, а твое дело -- просто вовремя выходить и не глушить ее stdout/err.
| |
|
2.9, Омомо (?), 22:25, 03/03/2022 [^] [^^] [^^^] [ответить]
| +1 +/– |
> set -euo pipefail
> shopt -s inherit_errexit
там в шебанге -- '/bin/sh', нет никакого pipefail.
какой такой шопт? его тоже нет.
| |
|
3.11, john_erohin (?), 07:46, 04/03/2022 [^] [^^] [^^^] [ответить]
| +2 +/– |
> там в шебанге -- '/bin/sh', нет никакого pipefail.
однако "set -e" есть.
> какой такой шопт? его тоже нет.
есть такие потребители смузей, что линкуют жырный bash на /bin/sh
| |
|
4.42, ммнюмнюмус (?), 22:08, 19/04/2022 [^] [^^] [^^^] [ответить]
| +/– |
> есть такие потребители смузей, что линкуют жырный bash на /bin/sh
А ещё у bash конвейеры передают быстрее, чем (внезапно) тот же dash, сам мерял.
| |
|
3.29, Аноним (29), 05:56, 03/04/2022 [^] [^^] [^^^] [ответить]
| –1 +/– |
Пытаться сделать что-то с POSIX-шеллом сложнее hello world — бесполезная трата времени.
Писать на баше это разумный и оптимальный подход, за исключением 3½ вырожденных случаев, которые ты за свою жизнь в дикой природе не встретишь, а если встретишь, то и там тоже будет баш.
| |
|
4.30, john_erohin (?), 05:50, 06/04/2022 [^] [^^] [^^^] [ответить]
| +/– |
> Пытаться сделать что-то с POSIX-шеллом сложнее hello world — бесполезная трата времени.
на чистом /bin/sh - да, возможно.
но зачем, если есть grep, sed и awk.
| |
4.34, Аноним (34), 03:31, 07/04/2022 [^] [^^] [^^^] [ответить]
| +/– |
Если что-то трудно изобразить на чистом шелле, то на баше получится урод еще покруче. Как раз 3.5 случая, когда башизмы хорошо ложатся. Лично мне проще писать на примитивном и простом как палка шелле, чем зазубривать все особенности баша.
| |
|
5.54, OpenEcho (?), 19:24, 25/02/2023 [^] [^^] [^^^] [ответить]
| +/– |
> чем зазубривать все особенности баша.
которые к тому же могут быть не совместимыми между версиями
| |
|
4.55, OpenEcho (?), 19:28, 25/02/2023 [^] [^^] [^^^] [ответить]
| +/– |
> Пытаться сделать что-то с POSIX-шеллом сложнее hello world — бесполезная трата времени.
Так и запишем, - "не одолел" :)
На чистом шеле + стандартных утилитах типа sed, awk, tr, jq... можно написать большинство админовских задач ^значительно быстрее^ чем использование более высокоуровневых языков
| |
|
|
|
1.3, john_erohin (?), 21:43, 28/02/2022 [ответить] [﹢﹢﹢] [ · · · ]
| –4 +/– |
> что за задачка такая странная? Зачем это вообще нужно?
я хочу перепаковать. накопилось всякого в tar.gz, CPU и память есть.
в дальнейшем переведу упаковку логов в lzma.
>> echo
> printf
отказать. снижает читаемость.
> Зачем весь скрипт помещать внутрь гигантского ифа?
"структурное програмирование". слыхали про такую парадигму ?
> зачем универсальному кросс-дистровому скрипту
linux only. существенно используется
https://www.opennet.ru/tips/3187_idle_cpulimit_limit_process_scheduler_linux.s
> почему ошибки идут в stdout, а не в stderr?
справделиво. я исправлю это.
> где стандартная преамбула, врубающая строгий режим?
в dash этого нет.
и наконец:
> > CopyLeft (L)
> Что за лицензия такая?
как копирайт, только наоборот. google it.
| |
|
2.4, Аноним (2), 07:55, 01/03/2022 [^] [^^] [^^^] [ответить] | +4 +/– | echo не надежен, т к не дает универсального интерфейса для вывода самых разных... большой текст свёрнут, показать | |
|
|
4.22, ммнюмнюмус (?), 02:38, 29/03/2022 [^] [^^] [^^^] [ответить]
| +/– |
> Например, выведи мне строку "-n".
> echo -e '\b-n'
А если переносимо, чтоб и на bash и на dash?
Например, dash выдаст: -e-n
В стандарте на posix shell вообще нет echo.
printf '%s' "строка" # Вполне читаемо
| |
|
5.23, pavlinux (ok), 12:24, 29/03/2022 [^] [^^] [^^^] [ответить]
| +1 +/– |
>> Например, выведи мне строку "-n".
>> echo -e '\b-n'
> А если переносимо, чтоб и на bash и на dash?
[ $SHELL == "dash" ] then
[ $SHELL == "bash" ] then
[ $SHELL == "mash" ] then
[ $SHELL == "sash" ] then
> Например, dash выдаст: -e-n
On XSI-conformant systems, if the first operand is -n, it shall be treated as a string,
not an option. The following character sequences shall be recognized on XSI-conformant
systems within any of the arguments:
Так что, это ты пишешь не по стандарту, а не echo плохое. :D
> В стандарте на posix shell вообще нет echo.
The Open Group Base Specifications Issue 7, 2018 edition
IEEE Std 1003.1-2017 (Revision of IEEE Std 1003.1-2008)
Copyright © 2001-2018 IEEE and The Open Group
https://pubs.opengroup.org/onlinepubs/9699919799.2018edition/
| |
|
6.24, ммнюмнюмус (?), 22:50, 31/03/2022 [^] [^^] [^^^] [ответить]
| +/– |
>>> Например, выведи мне строку "-n".
>>> echo -e '\b-n'
>> А если переносимо, чтоб и на bash и на dash?
> [ $SHELL == "dash" ] then
> [ $SHELL == "bash" ] then
> [ $SHELL == "mash" ] then
> [ $SHELL == "sash" ] then
Кажется, вы предлагали echo для компактности. Все, гуляй компактность.
>> Например, dash выдаст: -e-n
> On XSI-conformant systems, if the first operand is -n, it shall be
> treated as a string,
> not an option. The following character sequences shall be recognized on XSI-conformant
> systems within any of the arguments:
Прямо перед этим:
> If the first operand is -n, or if any of the operands contain a <backslash> character, the results are implementation-defined.
===============
> Так что, это ты пишешь не по стандарту, а не echo плохое.
> :D
printf един, а у echo
>APPLICATION USAGE
> It is not possible to use echo portably across all POSIX systems unless both -n (as the first argument) and escape sequences are omitted.
> The printf utility can be used portably to emulate any of the traditional behaviors of the echo utility as follows (assuming that IFS has its standard value or is unset):
================
>> В стандарте на posix shell вообще нет echo.
> The Open Group Base Specifications Issue 7, 2018 edition
> IEEE Std 1003.1-2017 (Revision of IEEE Std 1003.1-2008)
> Copyright © 2001-2018 IEEE and The Open Group
> https://pubs.opengroup.org/onlinepubs/9699919799.2018edition/
Ну тогда уж сюда, а то еще раздел "Command language" искать.
https://pubs.opengroup.org/onlinepubs/9699919799.2018edition/utilities/echo.ht
И то - сам стандарт прямо говорит, что переносимость у echo так себе. Вот делать нечего, как зачитывать все эти имена вместо одной строчки printf. Не та цель.
| |
|
|
|
3.56, OpenEcho (?), 19:35, 25/02/2023 [^] [^^] [^^^] [ответить]
| +/– |
> разных строк. Например, выведи мне строку "-n". Вот попробуй сам: echo -n
Я что то не понял, а в чем проблема?
echo -n '-n'
| |
|
2.6, Аноним (6), 20:03, 02/03/2022 [^] [^^] [^^^] [ответить]
| +4 +/– |
> хочу перепаковать .. в lzma
zcat in.tar.gz | lzma > out.tar.xz
Использования неименованного канала командной оболочки предотвращает передачу метаданных сжатого файла tar-архива. Но метаданные файлов внутри tar-архива хранятся в самом tar-архиве и сохраняются, он вообще не распаковывается.
Так как и gzip, и xz (lzma) умеют сжимать только один файл, имеет смысл использовать их только в связке с tar, который обеспечит сохранность метаданных.
| |
|
|
4.12, john_erohin (?), 07:55, 04/03/2022 [^] [^^] [^^^] [ответить]
| –1 +/– |
> zcat in.tar.gz | lzma > out.tar.lzma
не все так хорошо.
от использования cpulimit в tar.gz появился концевой мусор,
поэтому придеься усложнить проверку:
GZT='mktemp'
/usr/bin/eatmydata -- \
/usr/bin/nice -19 \
/usr/bin/chrt --idle 0 \
/usr/bin/ionice -c 3 \
gzip -vt $F.gz > $GZT 2>&1
RC=$?
if [ $RC -ge 1 ]; then
grep -q "decompression OK, trailing garbage ignored" $GZT
if [ $? -eq 0 ]; then
RC=0
else
echo error $RC in $F.gz : integrity test failed
rm $GZT
exit $RC
fi
fi
| |
|
5.57, OpenEcho (?), 23:17, 25/02/2023 [^] [^^] [^^^] [ответить]
| +/– |
А зачем вот это все?
> /usr/bin/eatmydata -- \
> /usr/bin/nice -19 \
> /usr/bin/chrt --idle 0 \
> /usr/bin/ionice -c 3 \ | |
|
|
|
2.8, Аноним (6), 20:09, 02/03/2022 [^] [^^] [^^^] [ответить]
| +3 +/– |
А скрипт просто ужасен. Переменные без кавычек после rm и mv - верный путь удалить себе ноги или переместить их вместо рук.
Надо так:
mv -v -- "$F"
rm -v -- "$F"
| |
|
3.33, Аноним (34), 03:19, 07/04/2022 [^] [^^] [^^^] [ответить]
| –1 +/– |
Переменная проверяется до mv и rm, смысла нет засирать кавычками и флажками. Если что-то такое с пробелами в $F подсунуть, иф упадет.
У вас просто догма - нужно все обкавычивать, как бы чего не вышло.
| |
|
4.36, Аноним (36), 12:23, 13/04/2022 [^] [^^] [^^^] [ответить] | +/– | Из каких конструкций можно понять, что переменная действительно проверяется до m... большой текст свёрнут, показать | |
4.46, Аноним (46), 15:26, 28/04/2022 [^] [^^] [^^^] [ответить]
| +1 +/– |
> Переменная проверяется до mv и rm, смысла нет засирать кавычками и флажками.
Дешёвые понты. "Засирать" - это как раз про такой говнокод, в котором нужно постоянно разбираться, что за чем проверялось. А двойные кавычки и EoO спасут ещё не один системный корень.
| |
4.58, OpenEcho (?), 23:22, 25/02/2023 [^] [^^] [^^^] [ответить]
| +/– |
> У вас просто догма - нужно все обкавычивать, как бы чего не вышло.
Значит вы еще не наступали на грабли, иначе бы знали почему шелчек ругается на безковычковые переменные
| |
|
|
|
3.18, john_erohin (?), 13:20, 26/03/2022 [^] [^^] [^^^] [ответить]
| +/– |
> Но зачем в устаревший lzma, а не в xz?
по результатам тестов. у lzma лучше результаты на этой коллекции.
| |
|
|
5.59, OpenEcho (?), 23:27, 25/02/2023 [^] [^^] [^^^] [ответить]
| +/– |
> zstd пробовали?
Хорош, но очень уж голоден до памяти, S2 не хуже, быстрей и жрет памяти меньше
| |
|
|
|
|
1.10, Омомо (?), 22:31, 03/03/2022 [ответить] [﹢﹢﹢] [ · · · ]
| +/– |
"не нужно! этот ваш шелл нечитаемый. пишите на нормальных языках!"
(я не знаю стандартные утилиты, не понимаю, зачем был сделан шелл, не знаю, что такое stdio и статус завершения процесса, пишу на питоне)
| |
1.13, i (??), 01:29, 09/03/2022 [ответить] [﹢﹢﹢] [ · · · ]
| +/– |
Одно дело написать скриптец, чтобы он за вечерок перелопатил что-то, или за выходные, и совсем другое делать готовое решение, решение которое должно кроме защиты от инжектов включать защиты от двойного запуска, уметь определять когда оно было прервано, чтобы продолжать с нужного места, на баше это конечно делается, но настолько муторно, что проще переписать на чем-то вменяемом.
| |
|
2.15, Pavel (??), 16:04, 23/03/2022 [^] [^^] [^^^] [ответить]
| +/– |
А чего тут муторного?
PIDFILE="/run/myscript.pid"
if [ -f "${PIDFILE}" ]; then
pkill -0 -F "${PIDFILE}" \
&& echo "Script already run" \
&& exit 0 \
|| echo "Starting new instance"
fi
echo $$ > "${PIDFILE}"
| |
|
3.26, ммнюмнюмус (?), 23:37, 31/03/2022 [^] [^^] [^^^] [ответить]
| +/– |
> А чего тут муторного?
> PIDFILE="/run/myscript.pid"
> if [ -f "${PIDFILE}" ]; then
> pkill -0 -F "${PIDFILE}" \
> && echo "Script already run" \
> && exit 0 \
> || echo "Starting new instance"
> fi
> echo $$ > "${PIDFILE}"
Если на полную катушку, то у шеллов (не только bash) должны быть стандартные пути для скриптов-библиотек, включая сами библиотеки. Вот это была бы моща.
| |
|
4.37, Аноним (36), 12:40, 13/04/2022 [^] [^^] [^^^] [ответить]
| +/– |
Так это делают: source /папка/файл
Только тогда необходимость учитывать в каждый момент времени много скушных неочевидных обстоятельств. Которые в продвинутых языках не допускают для уменьшения числа ошибок.
Знания, что у каких-то топовых шелл 'set +e' будет принудительно сделан по POSIX при уровне вложенности более x (x=2, если верно помню), хоть бы и напишешь 'set -e'. И т.д. про '-o pipefail'. Что надёжные коды возврата из функций только строго беззнаковый байт.
Что если при 'set -x' есть $0 и $LINENO внутри PS4, то в случае source сработает неудобно.
Пространства имён переменных. Вот это всё про local, export... Проблемность глобальности переменных.
Кодить можно, но есть другие более предназначенные для того инструменты.
| |
|
5.39, ммнюмнюмус (?), 16:16, 17/04/2022 [^] [^^] [^^^] [ответить]
| +/– |
> Знания, что у каких-то топовых шелл 'set +e' будет принудительно сделан по POSIX при уровне вложенности более x (x=2, если верно помню), хоть бы и напишешь 'set -e'
А это точно есть в posix?
posix-мануал для set про это ни слова (про опцию -e), да и слов force / nest там не найдено.
По моему, если про это не сказано в стандарте, значит это против него).
| |
|
|
3.28, ммнюмнюмус (?), 23:51, 31/03/2022 [^] [^^] [^^^] [ответить]
| +/– |
# То же самое, но чуть более читаемо
PIDFILE="/run/myscript.pid"
if [ -f "${PIDFILE}" ] && pkill -0 -F "${PIDFILE}"; then
echo "Script already run"
exit 0
fi
echo "Starting new instance"
echo $$ > "${PIDFILE}"
| |
3.32, Аноним (34), 03:06, 07/04/2022 [^] [^^] [^^^] [ответить]
| +/– |
> А чего тут муторного?
> PIDFILE="/run/myscript.pid"
> if [ -f "${PIDFILE}" ]; then
> pkill -0 -F "${PIDFILE}" \
> && echo "Script already run" \
> && exit 0 \
> || echo "Starting new instance"
> fi
> echo $$ > "${PIDFILE}"
Вроде бы есть утилитка, которая нечто подобное реализует.
| |
|
|
1.19, pavlinux (ok), 18:30, 26/03/2022 [ответить] [﹢﹢﹢] [ · · · ]
| +/– |
> /usr/bin/nice -19 \
> /usr/bin/chrt --idle 0 \
> /usr/bin/ionice -c 3 \
Дедовские методы и особо без гарантий.
# mount -t cgroup -o all cgroup /sys/fs/cgroup;
# mkdir /sys/fs/cgroup/$$
# cd /sys/fs/cgroup/$$
...
и понеслось рулить лимитами
...
| |
|
|
3.43, pavlinux (ok), 11:30, 25/04/2022 [^] [^^] [^^^] [ответить]
| +/– |
> Так ведь у автора зато без sudo.
Афтор - чайник, у него "/usr/bin/nice -19",
он наверное не в курсе, что МИНУС 19 - это макс. приоритет в планировщике. :D
Не, ну мож наоборот, он гений. И вычислил, что комбинация: "nice -19, chrt --idle 0, ionice -c 3"
даёт минимальный оверхэд. Типа в планировщике по-быстренькому отдуплился и дальше ждать ушёл.
Но у меня такое ощщущенние, что это больше на DoS похоже.
В планировщике задач будет часто появляться, при этом у таймера будет приоритет IDLE 0,
но планировщик его не вытолкнет, будет ждать окончания ionice 3;
| |
|
4.48, john_erohin (?), 21:55, 12/05/2022 [^] [^^] [^^^] [ответить]
| +/– |
> Афтор - чайник, у него "/usr/bin/nice -19",
> он наверное не в курсе, что МИНУС 19 - это макс. приоритет
> в планировщике. :D
тонко !
я даже начал сомневаться в себе. но потом проверил.
0) есть builtin nice в разных шеллах, несовместимое внутри себя. а есть вот чего:
$ file /usr/bin/nice
/usr/bin/nice: ELF 64-bit LSB pie executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, BuildID[sha1]=2d64570259ee4ea90022ff7c87afbce7b6366f17, for GNU/Linux 3.2.0, stripped
я по очевидным причинам использую именно это.
1) man top
/NI
13. NI -- Nice Value
The nice value of the task. A negative nice value means higher priority, whereas a
positive nice value means lower priority. Zero in this field simply means priority will
not be adjusted in determining a task's dispatch-ability.
2) и вот представьте себе, процессы запущенные через "/usr/bin/nice -19"
по данным top имеют NI = 19 (плюс 19),
а треды ядра типа rcu* и mm* имеют NI = -20 (минус двадцать).
что бы это значило ?
| |
|
5.49, pavlinux (ok), 17:07, 21/05/2022 [^] [^^] [^^^] [ответить]
| +/– |
Косяк это шелов и окружений (env), если nice -19 exec у тебя показывает наименьший,
то nice 19 exec не сможешь указать. Чтоб работало везде пиши: nice -n 19 или nice -n -19;
> а треды ядра типа rcu* и mm* имеют NI = -20 (минус двадцать).
> что бы это значило ?
Это значит у них максимальный приоритет!!!
| |
|
6.50, john_erohin (?), 22:17, 10/06/2022 [^] [^^] [^^^] [ответить]
| +/– |
> Чтоб работало везде пиши: nice -n 19 или nice -n -19;
отказать. чтобы работало везде надо вызывать /usr/bin/nice именно так как написано.
| |
|
|
4.61, OpenEcho (?), 23:37, 25/02/2023 [^] [^^] [^^^] [ответить]
| +/– |
> Но у меня такое ощщущенние, что это больше на DoS похоже.
Угу, у меня такое-же мнение
| |
|
|
|
1.44, pavlinux (ok), 12:23, 25/04/2022 [ответить] [﹢﹢﹢] [ · · · ]
| +/– |
#!/bin/bash
#
# перед стартом проверить наличие find, file, rename, stat, chmod, chown, touch, zcat, lzma, ...
for d in $(find -noleaf -xdev -type d)
do
pushd .;
cd $d
for i in $(ls -1 *[gG][zZ]); # .tgz, .GZ тоже бывают.
do
if [ "$(file --mime-type $i|cut -d' ' -f2)" != "application/gzip" ];
then
continue;
fi
# тут должно быть определение прав доступа на (запись, chmod/chown оригинала)
zcat $i | lzma -cz9 > $i.lzma;
touch -a -d "'stat -c '%x' $i'" $i.lzma;
touch -m -d "'stat -c '%y' $i'" $i.lzma;
chown "'stat --printf '%u:%g' $i'" $i.lzma;
chmod "'stat -c '%a' $i'" $i.lzma;
rename 's/gz.lzma/lzma/' $i.lzma
rm $i;
done;
popd;
done
| |
|
2.45, Аноним (46), 15:18, 28/04/2022 [^] [^^] [^^^] [ответить]
| +/– |
> if [ "$(file --mime-type $i|cut -d' ' -f2)" != "application/gzip" ]; then continue; fi
case "$(env LC_ALL=C file --mime-type --brief -- "${i}")" in application/gzip) continue ;; esac
| |
2.51, другой Аноним (?), 14:02, 25/06/2022 [^] [^^] [^^^] [ответить]
| +/– |
[~/src]:$ file --ver
file-5.33
magic file from /etc/magic:/usr/share/misc/magic
[~/src]:$ file --mime-type gpu_burn-0.4.tar.gz
gpu_burn-0.4.tar.gz: application/x-gzip
--
надо бы ещё проверять, а все ли утилиты файл возвращают application/gzip или кто-то application/x-gzip?
| |
|
3.52, pavlinux (ok), 19:12, 20/07/2022 [^] [^^] [^^^] [ответить]
| +/– |
> надо бы ещё проверять, а все ли
Я тож считают, что за время гемора в разработке этого скрипта,
можно было заработать на покупку 100Tb SSD. Это к вопросу об экономии места.
Портабельность тут почти на нуле. Напр. на SCO UNIX иль IRIX 7 не взлетит.
Не полетит на busybox-based дистрах, в Андроидах, скорее всего с BSD до 9 будут проблемы...
Для универсальности надо либо писать на ANSI C89/C++98/Perl 2.0/Python2,
либо тестить скрипты в csh на FreeBSD/NetBSD версий 1997-2000 годов.
| |
|
2.62, OpenEcho (?), 23:40, 25/02/2023 [^] [^^] [^^^] [ответить]
| +/– |
> for i in $(ls -1 *[gG][zZ]);
С этим можно хорошенько нарваться если в директории будет очень много файлов, т.к. можно легко нарваться на лимит CLI
| |
|
|