Size: a a a

2020 September 27

аᶘ

асоциальный пикотран... in pro.bash
Лень с Самосознанием
Писал, но, видимо, недостаточно много. Да и давно. Напомни)
Ну printf в шелл — это калька с printf'а из libc, позволяет печатать в stdout с заданным форматом.
Например, printf("%d %d %s\n", int1, int2, str1) напечатает строчку, заменив первый %d на значение переменной int1, второй — на int2, третий — на всю строку str1. В зависимости от того, какая буква идёт после %, printf по-разному интерпретирует аргументы, т.е. d — это decimal, целое число, а s — string, строка.
источник

аᶘ

асоциальный пикотран... in pro.bash
У printf в шелле есть особенность — если аргументов больше, чем спецификаторов, то они переиспользуются для последующих аргументов.
Т.е. printf "%s" 1 2 3 напечатает "123", потому что %s будет использован для 1, 2 и 3 соответственно :)
источник

Лс

Лень с Самосознанием... in pro.bash
асоциальный пикотранзистор ᶘಠᴥಠᶅ
Ну printf в шелл — это калька с printf'а из libc, позволяет печатать в stdout с заданным форматом.
Например, printf("%d %d %s\n", int1, int2, str1) напечатает строчку, заменив первый %d на значение переменной int1, второй — на int2, третий — на всю строку str1. В зависимости от того, какая буква идёт после %, printf по-разному интерпретирует аргументы, т.е. d — это decimal, целое число, а s — string, строка.
А, вот в чём дело. Я кодил под ардуинку, но там пользовался исключительно форматом printf "string", int ,"string"
или что-то такое. Буду знать)
источник

Лс

Лень с Самосознанием... in pro.bash
Спасибо!
источник

аᶘ

асоциальный пикотран... in pro.bash
→ cat test.sh
#!/bin/bash
set -efu
printf "There are %d arguments\n" "$#"
printf "%s " "$@" | grep -o "\d*[0,2,4,6,8]"
zar@delta in ~/src/vk2rss (master)
→ shellcheck test.sh
источник

Лс

Лень с Самосознанием... in pro.bash
асоциальный пикотранзистор ᶘಠᴥಠᶅ
→ cat test.sh
#!/bin/bash
set -efu
printf "There are %d arguments\n" "$#"
printf "%s " "$@" | grep -o "\d*[0,2,4,6,8]"
zar@delta in ~/src/vk2rss (master)
→ shellcheck test.sh
Будем радовать изначального клиента этой задачки?) Оно, по... А быстрее ли оно?
источник

аᶘ

асоциальный пикотран... in pro.bash
Лень с Самосознанием
Будем радовать изначального клиента этой задачки?) Оно, по... А быстрее ли оно?
Ну смотри, предыдущее решенее выполнялось исключительно внутри шелла и делала понятные для процессора арифметические операции (хоть и с постоянным переводом из строк в числа и обратно).

Твоё решение сводится к запуску процесса, компиляции регэкспа и выполнении матчинга по небольшой строке.
источник

аᶘ

асоциальный пикотран... in pro.bash
Интересно, а есть ли способ запустить условный UNIX System V, портированный на Intel, со скоростью работы как на i386. Так можно было бы тестировать и совместимость, и скорость работы :)
источник

Лс

Лень с Самосознанием... in pro.bash
асоциальный пикотранзистор ᶘಠᴥಠᶅ
Ну смотри, предыдущее решенее выполнялось исключительно внутри шелла и делала понятные для процессора арифметические операции (хоть и с постоянным переводом из строк в числа и обратно).

Твоё решение сводится к запуску процесса, компиляции регэкспа и выполнении матчинга по небольшой строке.
Мда. Нужно объяснять где какой?)
➜  ~ hyperfine -w 3 -r 1000 "./test1.sh {1..100}" "./test2.sh {1..100}"
Benchmark #1: ./test1.sh {1..100}
 Time (mean ± σ):      16.9 ms ±   2.6 ms    [User: 10.7 ms, System: 5.6 ms]
 Range (min … max):    12.6 ms …  38.8 ms    1000 runs

Benchmark #2: ./test2.sh {1..100}
 Time (mean ± σ):       7.9 ms ±   1.4 ms    [User: 5.2 ms, System: 3.1 ms]
 Range (min … max):     6.0 ms …  22.4 ms    1000 runs

Summary
 './test2.sh {1..100}' ran
   2.13 ± 0.49 times faster than './test1.sh {1..100}'
источник

аᶘ

асоциальный пикотран... in pro.bash
Лень с Самосознанием
Мда. Нужно объяснять где какой?)
➜  ~ hyperfine -w 3 -r 1000 "./test1.sh {1..100}" "./test2.sh {1..100}"
Benchmark #1: ./test1.sh {1..100}
 Time (mean ± σ):      16.9 ms ±   2.6 ms    [User: 10.7 ms, System: 5.6 ms]
 Range (min … max):    12.6 ms …  38.8 ms    1000 runs

Benchmark #2: ./test2.sh {1..100}
 Time (mean ± σ):       7.9 ms ±   1.4 ms    [User: 5.2 ms, System: 3.1 ms]
 Range (min … max):     6.0 ms …  22.4 ms    1000 runs

Summary
 './test2.sh {1..100}' ran
   2.13 ± 0.49 times faster than './test1.sh {1..100}'
Да, надо. Цифры какие-то запредельные.
источник

аᶘ

асоциальный пикотран... in pro.bash
Лень с Самосознанием
Мда. Нужно объяснять где какой?)
➜  ~ hyperfine -w 3 -r 1000 "./test1.sh {1..100}" "./test2.sh {1..100}"
Benchmark #1: ./test1.sh {1..100}
 Time (mean ± σ):      16.9 ms ±   2.6 ms    [User: 10.7 ms, System: 5.6 ms]
 Range (min … max):    12.6 ms …  38.8 ms    1000 runs

Benchmark #2: ./test2.sh {1..100}
 Time (mean ± σ):       7.9 ms ±   1.4 ms    [User: 5.2 ms, System: 3.1 ms]
 Range (min … max):     6.0 ms …  22.4 ms    1000 runs

Summary
 './test2.sh {1..100}' ran
   2.13 ± 0.49 times faster than './test1.sh {1..100}'
Сделай лучше cat test1.sh и cat test2.sh сразу.
источник

Лс

Лень с Самосознанием... in pro.bash
асоциальный пикотранзистор ᶘಠᴥಠᶅ
Да, надо. Цифры какие-то запредельные.
Первый мой с grep, второй твой. У меня ноут не слишком мощный
источник

Лс

Лень с Самосознанием... in pro.bash
асоциальный пикотранзистор ᶘಠᴥಠᶅ
Сделай лучше cat test1.sh и cat test2.sh сразу.
➜  ~ cat test1.sh
#!/bin/bash
set -efu
printf "There are %d arguments\n" "$#"
echo "$@" | grep -P -o "\d*[0,2,4,6,8]\W" -
➜  ~ cat test2.sh
#!/bin/bash
set -efu

n=1

printf "There are %d arguments\n" "$#"
for arg in "$@"
do
       if [ "$((n % 2))" -eq 0 ]; then
               printf "%s\n" "${arg}"
       fi
       n=$(($n + 1))
done
источник

аᶘ

асоциальный пикотран... in pro.bash
Лень с Самосознанием
➜  ~ cat test1.sh
#!/bin/bash
set -efu
printf "There are %d arguments\n" "$#"
echo "$@" | grep -P -o "\d*[0,2,4,6,8]\W" -
➜  ~ cat test2.sh
#!/bin/bash
set -efu

n=1

printf "There are %d arguments\n" "$#"
for arg in "$@"
do
       if [ "$((n % 2))" -eq 0 ]; then
               printf "%s\n" "${arg}"
       fi
       n=$(($n + 1))
done
У тебя sh → bash?
источник

️ ️️ in pro.bash
Лень с Самосознанием
➜  ~ cat test1.sh
#!/bin/bash
set -efu
printf "There are %d arguments\n" "$#"
echo "$@" | grep -P -o "\d*[0,2,4,6,8]\W" -
➜  ~ cat test2.sh
#!/bin/bash
set -efu

n=1

printf "There are %d arguments\n" "$#"
for arg in "$@"
do
       if [ "$((n % 2))" -eq 0 ]; then
               printf "%s\n" "${arg}"
       fi
       n=$(($n + 1))
done
во втором можно просто for arg; do
источник

Лс

Лень с Самосознанием... in pro.bash
не делал. Когда-то делал sh=>dash, но не на этой установке, вроде
источник

аᶘ

асоциальный пикотран... in pro.bash
Лень с Самосознанием
не делал. Когда-то делал sh=>dash, но не на этой установке, вроде
Я имел в виду, у тебя сейчас /bin/sh на что ссылается?
источник

Лс

Лень с Самосознанием... in pro.bash
асоциальный пикотранзистор ᶘಠᴥಠᶅ
Я имел в виду, у тебя сейчас /bin/sh на что ссылается?
А, на этой. На dash
источник

️ ️️ in pro.bash
Лень с Самосознанием
Это меня до сих пор мучало, где-то на заднем плане. А только что меня осенило
echo {1..100} | grep -P "\d*[0,2,4,6,8]"

И чего мы сразу не додумались?
seq 2 2 100
источник

аᶘ

асоциальный пикотран... in pro.bash
Лень с Самосознанием
А, на этой. На dash
Всё-таки переведи оба свои скрипта на шебанг с /bin/sh и перезапусти тест.
источник