LINUX.ORG.RU

Вывод данных в одну строку с замещением.

 


0

1

Доброго времени, ЛОР! Есть скрипт, который сыпет выводом случайных комбинаций в терминал, до тех пор, пока комбинация не станет подходящей. Хотелось бы сделать вывод в одну строку, что бы значения сменяли друг друга. Пробовал в конце каждого цикла добавлять clear, но результат далеко не фонтан - все моргает, иногда вообще не успевает выводить значения... В общем, хочется сделать все красиво, но не знаю куда копнуть.


Просто скажите, что вы еврей и у вас вывод идёт RTL.

blitz
()
Ответ на: комментарий от vvn_black

не совсем понял с чем этот ключ совмещать, потому как ни c echo, ни с printf желаемого результата я не получил.

Попытаюсь примерно объяснить чего хочу добиться:

for i in $(seq 1 1000); do openssl rand -hex 8; sleep 0.05; clear; done

нужно сделать, что то подобное, но без clear и sleep. Спасибо

Sherman
() автор топика
Ответ на: комментарий от Sherman

Во-первых, надо подавить \n, который печатает опенссл. После этого можно при помощи \r возвращать каретку. Вот

for i in $(seq 1 1000); do echo -n $'\r'$(openssl rand -hex 8); sleep 0.05; done
# или так
for i in $(seq 1 1000); do openssl rand -hex 8 | tr $'\n' $'\r'; sleep 0.1;  done

legolegs ★★★★★
()
Последнее исправление: legolegs (всего исправлений: 1)
Ответ на: комментарий от vodz

действительно, то что нужно, спасибо.

Sherman
() автор топика
Ответ на: комментарий от vodz

<зануда mode>
Только поменять обратные кавычки на $( )

for i in $(seq 1 1000); do printf "%s\r" "$( openssl rand -hex 8 )"; sleep 0.1;  done
</зануда mode>

Kroz ★★★★★
()
Ответ на: комментарий от Kroz

Только поменять обратные

Кому надо? Вы бы ознакомились, для чего этот аналог придуман, а потом уж возражайте.

vodz ★★★★★
()
Ответ на: комментарий от blitz

Таки не обязательно менять в zsh.

В bash тоже не обязательно. Просто best practice.

Kroz ★★★★★
()
Ответ на: комментарий от vodz

Кому надо? Вы бы ознакомились, для чего этот аналог придуман, а потом уж возражайте.

Ознакомился. С обратными кавычками сложнее делать вложенные конструкции. Плюс $( ) визуально удобней. Недостатков у $( ) по сравнению с `` нет. Я что-то упустил?

Kroz ★★★★★
()
Ответ на: комментарий от Kroz

Недостатков у $( ) по сравнению с `` нет.

⸮Три символа вместо двух!!!

Psych218 ★★★★★
()
Ответ на: комментарий от Kroz

С обратными кавычками сложнее делать вложенные конструкции.

Не сложнее, а невозможно.

Плюс $( ) визуально удобней.

Ерунда. Это кто так написал? Если англоязычный, то у них вообще-то `кавычки' принято рисовать, причём второй символ тоже их не очень устраивает по причине, что это суррогат, рисуемый без наклона.

При сложном коде может получиться гора скобок и наоборот не будет никакой визуальщины.

Недостатков у $( ) по сравнению с `` нет. Я что-то упустил?

Безусловно. Синтаксис $() появился позже и не имеет преимуществ в большинстве случаев, ибо вложенные сабпроцессы - это то ещё удовольствие в плане обработки многосложного вывода, то есть безопасности и производительности.

vodz ★★★★★
()
Ответ на: комментарий от vodz

С обратными кавычками сложнее делать вложенные конструкции.

Не сложнее, а невозможно.

echo "This echo `echo "is a \`echo "text"\`"`" 

>
Плюс $( ) визуально удобней.

Ерунда. Это кто так написал?

По-моему тот случай, когда достаточно самому посмотреть.

Короче, на вкус и цвет...
Пусть ТС знает обе конструкции и сам решает.

Kroz ★★★★★
()
Ответ на: комментарий от Kroz

echo «This echo `echo „is a \`echo „text“\`“`»

Хорошая попытка, но это фокус, работающий только при внешних двойных кавычках. Если их сделать невозможно, то всё рассыпается, так как «text» будет только смущать глаза, ибо кавычка перед «t» на самом деле это закрывающая кавычка той, что перед «i».

$ touch aaa.txt
$ echo "This echo `echo "is a \`echo "*.txt"\`"`"
This echo is a *.txt
$ echo This echo `echo "is a \`echo *.txt\`"`
aaa.txt
$ echo This echo `echo "is a \`echo "*.txt"\`"`
aaa.txt
$ echo 'This echo `echo "is a \`echo '*.txt'\`"`'
This echo `echo "is a \`echo *.txt\`"`

vodz ★★★★★
()
Ответ на: комментарий от Kroz

[совсем привереда mode]

for i in $(seq 1 1000); do printf "%s\r" "$(which openssl) rand -hex 8 )"; sleep 0.1;  done
[/совсем привереда mode]

И не работает - (which openssl).

blitz
()
Ответ на: комментарий от vodz

Хорошая попытка, но это фокус, работающий только при внешних двойных кавычках.

...которые должны быть всегда и везде, где ты используешь переменные или конструкцию $( ), за исключением тех очень редких случаев когда есть веские причины это не делать.

Kroz ★★★★★
()
Ответ на: комментарий от blitz

Тогда избавляемся от seq и от printf:

for I in {1..1000}; do echo -ne "$( openssl rand -hex 8 )\r"; sleep 0.1; done

Kroz ★★★★★
()
Ответ на: комментарий от Kroz

..которые должны быть всегда и везде

Вот именно, а так как кавычки тоже не могут быть многоуровневыми, то юзая их на первом уровне, вы исключаете возможность их использования на втором.

или конструкцию $( )

Вот как раз эта конструкция от кавычек и избавляет.

за исключением тех очень редких случаев когда есть веские причины это не делать.

Во-во, типичный 100% наукообразный бред.

vodz ★★★★★
()
Ответ на: комментарий от vodz

Вот именно, а так как кавычки тоже не могут быть многоуровневыми, то юзая их на первом уровне, вы исключаете возможность их использования на втором.

Нет

Вот как раз эта конструкция от кавычек и избавляет.

Рискну повториться:
Двойные кавычки должны быть всегда и везде, где ты используешь переменные или конструкцию $( ), за исключением тех очень редких случаев когда есть веские причины это не делать.

за исключением тех очень редких случаев когда есть веские причины это не делать.

Во-во, типичный 100% наукообразный бред.

Рискну объяснить.

Проснувшись с бодуна в 2 часа ночи, и сев писать скрипт, человек должен везде, где есть строковые значения, ставить одинарные кавычки. При этом мозг может спокойно спать. Если скрипт не заработает, или если временно пробудившееся сознание обратит внимание рук на конструкции с долларом (использование переменных или «$( )» ), руки меняют одинарные кавычки на двойные, ну и экранируют спец. символы. Если скрипт и после этого не заработает, то нужно в качестве компенсации сообщить организму бутылочку освежающего (лично я предпочитаю в таких случаях, как ни странно, молоко; очень рекомендую), далее растормошить моск и дать ему задание объяснить что не так со строками. И только если моск уверенно скажет «тут кавычки ну реально мешают», только в этом случае их нужно убирать.
Здесь важна последовательность действий рук

Иными словами, если кавычки не обязательны, то они должны быть.

Так понятней?

Kroz ★★★★★
()
Ответ на: комментарий от Kroz

Вы форумом ошиблись. К наркологам и психотерапевтам - это не сюда.

vodz ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.