- Bash wait for keypress
- Example#1:
- Example#2:
- Example#3:
- Example#4:
- Example#5:
- Conclusion:
- About the author
- Fahmida Yesmin
- Bash — Press Any Key
- Bash Script – Press Any Key To Continue
- Bash Press Key to continue
- Adding a Time Out
- Some Variations
- Press ENTER to continue
- Press Escape to continue
- Support Us .
- Дюжина приемов в Linux, которые действительно сэкономят уйму времени
- 1. Разбиение строки при помощи variable expansions
- 2. Автокомплит в bash с использованием TAB
- 3. Автокомплит в bash с использованием TAB — 2
- 4. Sensitive data
- 5. Просмотр логов и grep
- 6. Уменьшение размера лог файлов
- 7. watch следит за тобой!
- 8. Последовательности в bash
- 9. tail, несколько файлов и несколько юзеров
- 10. создание файла нужного размера
- 11. xargs
- 12. sleep? while? read!
Bash wait for keypress
Example#1:
Create a bash file with the following script. When you will run the script, it will continue until the user presses any key. The script will wait for the user’s input in every 3 seconds and if the user doesn’t press any key then it will print the message, “waiting for the keypress“.
Output:
Example#2:
Create a bash file with the following script. An infinite while loop is used in this example that will terminate when the user will press ‘q’. If the user presses any key without ‘q’ then the value of the counter variable will be increased by 1 and print the value.
Output:
Example#3:
Create a bash file with the following script that will do different types of tasks based on the key pressed by the user. If the user presses ‘1’ then it will add two command line arguments and print. If the user presses ‘2’ then it will subtract two command line arguments and print. The script will run continuously until the user presses ‘3’.
#!/bin/bash
v1 = $1
v2 = $2
while :
do
echo «1. Addition»
echo «2. Subtraction»
echo «3. Quit»
echo -n «Type 1 or 2 or 3 :»
read -n 1 -t 15 a
printf » \n »
case $a in
1 * ) echo » $v1 + $v2 = $(($v1+$v2) )» ;;
2 * ) echo » $v1 — $v2 = $(($v1-$v2) )» ;;
* ) echo «Try again.» ;;
esac
done
Run the script with two numeric argument values.
Output:
Example#4:
Create a bash file with the following script. The script will terminate when the user will press ESC key. This script will print the keys pressed by the user until ESC key is pressed.
Output:
Example#5:
Create a bash file with the following code that will wait for ENTER key to terminate the script. The script will take a server name as input and will try to ping the server in every 2 seconds. If ping command gets the response from the server then it will terminate the script by displaying the output otherwise it will wait for the user’s response or ENTER key by printing the message, “Trying to connect with…”.
Output:
Conclusion:
This tutorial shows how you can write the bash script in various ways that will wait for the user’s input to do any specific task or terminate the script. Hope, after practicing the above examples, you will be able to write the script in such way that can wait for any keypress and do the particular task based on the key pressed by the user.
About the author
Fahmida Yesmin
I am a trainer of web programming courses. I like to write article or tutorial on various IT topics. I have a YouTube channel where many types of tutorials based on Ubuntu, Windows, Word, Excel, WordPress, Magento, Laravel etc. are published: Tutorials4u Help.
Источник
Bash — Press Any Key
Bash Script – Press Any Key To Continue
In this article I’ll describe what I have used to create a “Press Any Key to Continue” in a Bash script (Linux/MacOS X).
Working with scripts in Bash (Terminal or Shell) isn’t what I do daily. The day I had to create a script to help me do an SVN update followed by a massive recompile. I wanted to see the SVN result first before proceeding with recompile, so I had to add a “Press Any Key To Continue” option in the script.
Since it took me a little effort, I figured; let’s describe this in an article. After all, it may be good reference for myself and for others.
These methods work for Linux and MacOS.
Please consider disabling your ad blocker for our website.
We rely on these ads to be able to run our website.
You can of course support us in other ways (see Support Us on the left ).
Bash Press Key to continue
In certain situations, one may want a “Press any key to continue” option in a script, to give the user some time to review certain output of the script. For example, I made a script which does an SVN update of Lazarus Pascal, and then does a full clean “make”. Before the “make” starts, I’d like to review what was updated from SVN, just to give me an idea what to expect once the compiler and linker are done creating a new version of Lazarus Pascal. Obviously, you can apply this to your own script which may or may not be related to anything Lazarus Pascal.
For this we use the “read” command (man page), which is available under Linux and MacOS X. The man page under MacOS X is somewhat limited, not sure why, so I recommend looking at the link.
The simplest way, that I found, to accomplish this is:
Note that this catches all keys except keys like Shift, Alt, Ctrl, Windows, Alt-menu, and Command ( ). You could consider this a problem … or not.
Parameter | Purpose |
---|---|
-n 1 | Return after typing one character (and that’s why Alt, Shift and such do not work – as they are not characters). |
-r | Do not allow backslashes to escape characters (this way a backslash will work as well) |
-s | Do not echo (display) what is being typed. |
-p $”Press any key to continue\n” | Display a prompt saying “Press any key to continue” (\n = new line). Dollar symbol ($) must be before the quoted string to allow escape characters like new line. |
Please consider disabling your ad blocker for our website.
We rely on these ads to be able to run our website.
You can of course support us in other ways (see Support Us on the left ).
Adding a Time Out
We can expand this line with a time out. So if the user does not press any key within an x amount of seconds (5 seconds in the example below), the script will continue as if the user had pressed a key. This is done as such:
The parameter “ -t 5 ” sets the timeout to 5 seconds – which you can alter whatever time you’d prefer.
Some Variations
Press ENTER to continue
Press Escape to continue
Here -d $ ‘\e’ determines that the Escape key (\e) is the “final” character (kind-a like using the ENTER key). So be aware that the user can type a bunch of other characters (not displayed) before they press Escape.
Note : the “Press any key to continue” would have worked with the Escape key as well … and may even be the better solution unless pressing Escape is required.
Support Us .
Your support is very much appreciated, and can be as easy as sharing a link to my website with others, or on social media.
Support can also be done by sponsoring me, and even that can be free (e.g. shop at Amazon).
Any funds received from your support will be used for web-hosting expenses, project hardware and software, coffee, etc.
Thank you very much for those that have shown support already!
It’s truly amazing to see that folks like my articles and small applications.
Please note that clicking affiliate links, like the ones from Amazon, may result in a small commission for us — which we highly appreciate as well.
- Amazon — Anything you buy at Amazon will sponsor us! — You will not pay anything extra. — Keep shopping at Amazon and support us!» target=»_blank»>Do your shopping at Amazon Use PayPal to give me a cup of coffee (select: I like Coffee — Use PayPal to give me a cup of coffee ($5).» target=»_blank»>$5, I like Coffee — Use PayPal to give me two cups of coffee ($10).» target=»_blank»>$10, I like Coffee — Use PayPal to give me four cup of coffee ($20).» target=»_blank»>$20, or I like Coffee — Use PayPal to give me a custom amount of coffee.» target=»_blank»>custom amount)
Become a Patreon — Support us by becoming a Patreon!» target=»_blank»>Become a Patreon Support us by signing up with DropBox — We use DropBox for our website backup, extra space is always welcome. — By signing up we get an extra 500 Mb of storage space.» target=»_blank»>Sign up with DropBox BitCoin — We do accept donations in BitCoin (BTC) — Any amount is very welcome and much appreciated! — It will support webhosting and keep us motivated!» target=»_blank»>Donate in BitCoin (BTC) ( 16Ja1xaaFxVE4FkRfkH9fP2nuyPA1Hk7kR )
BitCoinCash (BCH) — We do accept donations in BitCoinCash — Any amount is very welcome and much appreciated! — It will support webhosting and keep us motivated!» target=»_blank»>Donate in BitCoin Cash (BCH) ( qzf4qwap44z88jkdassythjcnm54upacmvmvnzgddg )
Please consider disabling your ad blocker for our website.
We rely on these ads to be able to run our website.
You can of course support us in other ways (see Support Us on the left ).
Источник
Дюжина приемов в Linux, которые действительно сэкономят уйму времени
Эта статья также есть на английском.
Однажды вечером, перечитывая Джеффри Фридла, я осознал, что даже несмотря на всем доступную документацию, существует множество приемов заточенных под себя. Все люди слишком разные. И приемы, которые очевидны для одних, могут быть неочевидны для других и выглядеть какой-то магией для третьих. Кстати, несколько подобных моментов я уже описывал здесь.
Командная строка для администратора или пользователя — это не только инструмент, которым можно сделать все, но и инструмент, который кастомизируется под себя любимого бесконечно долго. Недавно пробегал перевод на тему удобных приемов в CLI. Но у меня сложилось впечатление, что сам переводчик мало пользовался советами, из-за чего важные нюансы могли быть упущены.
Под катом — дюжина приемов в командной строке — из личного опыта.
Маленькое отступление — в реале я использую множество приемов, в которых могут случайно встретиться имена реальных серверов или юзеров, что может попасть под NDA, поэтому я не мог копи-пастить и специально переписал и максимально упростил все примеры в статье — и если вам покажется, что какой-то прием в данном контексте совершенно бесполезен — возможно это как раз по этой причине. Но в любом случае делитесь вашими идеями в комментариях!
1. Разбиение строки при помощи variable expansions
Часто используют cut или даже awk, чтобы просто получить значение какого-то одного столбца.
Если нужно взять первые символов в строке, используют $
Но есть очень мощный инструмент, который позволяет манипулировать строками при помощи #, ##, % и %% (bash variable expansions) — с их помощью можно отрезать ненужное по паттерну с любой стороны.
Пример ниже показывает, как из строки «username:homedir:shell» можно получить только третий столбец (shell) при помощи cut или при помощи variable expansions (мы используем маску *: и команду ##, что означает отрезать слева все символы до последнего найденного двоеточия):
Второй вариант не запускает еще один процесс (cut), и вообще не использует пайпы, что должно работать гораздо быстрее. А если подобный скрипт выполнить в bash-подсистеме на windows, где пайпы еле шевелятся, разница в скорости будет огромна.
Давайте посмотрим пример на Ubuntu — крутим нашу команду в цикле 1000 раз
Разница — в несколько десятков раз!
Конечно, пример выше — слишком искусственный. В реальной жизни мы будем обрабатывать реальный файл. А в этом случае из него нужно читать. И для cut мы просто перенаправим файлик /etc/passwd. А в случае использования ##, нам придется создать цикл с использованием read. Итак, кто победит в этом варианте?
Еще парочка примеров:
2. Автокомплит в bash с использованием TAB
Пакет bash-completion сейчас идет в поставке практически всех дистрибутивов, включить его можно или в /etc/bash.bashrc или /etc/profile.d/bash_completion.sh, но чаще всего он уже включен из коробки. В общем автокомплит по TAB — это один из тех удобных моментов, с которыми новичок знакомится в первую очередь.
А вот то, что не все активно используют, и на мой взгляд совершенно зря, так это то что автокомплит работает не только с именами файлов, а также с алиасами, именами переменных, а если копнуть в скрипты автокомплита, которые собственно являются тоже шелл скриптами, можно даже дописать автокомплит для вашего скрипта или приложения. Но вернемся к алиасам.
Алиасам не нужно прописывать PATH, не нужно создавать отдельные исполняемый файл — они комфортно могут лежать в .profile или .bashrc.
В *nix обычно используется lowercase для файлов и каталогов, поэтому мне показалось удобным использовать алиасы с использованием uppercase — тогда автокомплит угадывает вашу мелодию с первой ноты работает буквально с первых букв:
3. Автокомплит в bash с использованием TAB — 2
Для более сложных случаев, часто пишутся скрипты и кладутся например в $HOME/bin.
Но есть же функции.
Им опять же не нужен PATH, и для них тоже работает автокомплит.
Поместим функцию LastLogin в .profile (не забудьте перегрузить .profile):
(На самом деле тут не так важно, что я написал внутри функции, это исключительно наглядный многострочный пример, который было бы не так удобно запихивать в alias)
Затем в консоли:
4. Sensitive data
Если перед командой поставить пробел, она не попадет в bash history, следовательно если в командной строке нужно ввести пароль открытым текстом, лучше такую команду исключить из истории — на примере ниже, echo «hello 2» в истории не появляется:
В скриптах, которые например нужно выложить в git или раскладывать их через ansible, можно сделать external bash file который будет лежать только на целевой машине, с правами 600, добавленный в .gitignore и содержать нужные пароли только для конкретного окружения, а в основной скрипт вызываться через source:
Но это также небезопасно — как заметил Tanriol, такой пароль можно будет увидеть в списке процессов, где отображается вся командная строка со всеми аргументами, поэтому лучше, чтобы приложение умело читать пароль из нужного файла самостоятельно.
Например, безопасный ssh не имеет опции, которая позволяет передать ему пароль в командной строке. А небезопасный wget — поддерживает опцию —password, и если на данной машине работают другие пользователи, они могут увидеть в списке процессов все параметры вашего wget, пока он запущен.
И наконец самый правильный вариант — шифровать данные (пароли сертификатов, пароли для доступа к удаленным системам, пароли от SQL) используя openssl и мастер ключ.
openssl поддерживает все необходимые опции, чтобы использовать его для шифрования паролей прямо в скриптах. Пример шифрования и дешифрования:
Файл secret.key хранит только одну строку:
Шифруем нашу строку алгоритмом aes-256-cbc, c использованием случайной соли:
Такую строку можно смело вставлять в скрипт или в конфигурационный файл какого-либо, который безопасно положить в .git — без secret.key его расшифровать будет сложно.
Перед использованием дешифровать в первоначальный вид можно той же командой, заменив только опцию -e на -d:
Также можно, чтобы приложение самостоятельно умело расшифровывать данные из конфигов, останется только согласовать, чтобы и ваш скрипт и приложение пользовались тем же secret.key и тем же алгоритмом.
5. Просмотр логов и grep
Часто можно использовать что-то вроде
Но не забывайте про опцию -v, которая выводит наоборот — строки, которые НЕ соответствуют шаблону — это позволяет вывести не только строку с проблемой, но и в случае exception все остальные строки, которые к нему относятся вот таким образом (исключаем все строки, в которых есть info, выводим все остальные):
Не забывайте использовать -P, так как по умолчанию grep использует basic regular expression, а не PCRE, и вы можете столкнуться с тем, что просто так группы не работают.
Не забывайте и про другие популярные опции «—line-buffered», «-i».
Если вы знаете регулярные выражения, то при помощи —only-matching, можно значительно улучшить вывод. Но в принципе это редко используется в случае разового использования. Зато очень рекомендую почитать мануал по grep, если вы пишете алиас/функцию/скрипт для многоразового использования.
6. Уменьшение размера лог файлов
В обычном состоянии, если приложение запущено и пишет в лог файл, его не рекомендуется удалять, поскольку в *nix, открытый файловый дескриптор связан не с именем файла, а с iNode.
И если мы удалим лог файл, приложение может не начать писать в новый файл с нуля, я продолжать писать в старый, который для нас уже будет недоступен по имени (мы же его удалили). Затем, когда приложение остановится и закроет дескриптор, данные удалятся с файловой системы.
(Большинство программ при записи в лог, каждый раз открывают и закрывают файл, и тогда этой проблеме они не подвержены)
Поэтому очистку файла следует делать либо так (очистим файл, не удаляя его):
Либо так (файл будет урезан до указанного размера):
Но команда выше именно урежет, что означает, что в файле останутся старые данные, а свежие как раз и будут урезаны.
Поэтому можно делать вот так, сохраняя последние 1000 строк:
Спасибо Himura за оптимизацию.
P.S. В данном примере мы не рассматриваем самый правильный способ — когда приложение само следит за своим лог-файлом пользуясь, например, log4j, или своим велосипедом или rotatelogs.
7. watch следит за тобой!
Бывает ситуация, когда ждешь какого-то события. Например, пока подключится пользователь (жмешь who несколько десятков раз), или кто-то скопирует по ftp файл (жмешь ls десятки раз).
По умолчанию, команда будет выполняться каждые 2 секунды с очисткой экрана, пока не нажать Ctrl+C. Частоту выполнения можно изменить опцией при запуске.
Очень полезно, когда работаешь на одном сервере
8. Последовательности в bash
Есть удобная возможность создавать диапазоны значений, например вместо такого:
использовать вот такое:
А еще можно использовать команду seq, чтобы форматировать вывод. Например выравниваем ширину автоматически:
А вот еще один пример конструкции с фигурными скобками, которая позволит массово переименовать файлы. Для получения имени файла без расширения используем basename:
А можно еще короче, с использованием %:
Для переименования файлов лучше использовать утилиту «rename»
Или вот пример для создания структуры каталогов под новый java проект:
9. tail, несколько файлов и несколько юзеров
Ранее упоминался multitail, который может следить за несколькими файлами сразу. Но он не поставляется из-под коробки, а права для установки есть не всегда.
Но с этим вполне может справиться и обычный tail:
Кстати, вернемся на минуту к алиасам с «tail -f».
Бывает, что на сервере, где крутится некое приложение, лазят разные тестировщики, разработчики и все смотрят лог приложения через tail -f. Даже на продакшене несколько саппортеров-индусов могут смотреть один и тот же лог каждый из своей сессии.
При перезапуске приложения, остаются висящие «tail -f», которые могут висеть несколько дней или даже месяцев. Это не то, чтобы проблема, но не аккуратненько.
Полезно будет сделать алиас, который получает PID вашего приложения из PID файла, и автоматически завершит tail при завершении процесса:
И добавить этот алиас во все профайлы. Даже если все ушли домой, забыв остановить свой tail, он автоматически завершится при рестарте приложения.
10. создание файла нужного размера
Часто пользуются dd
Но я рекомендую использовать fallocate:
На файловых системах, которые поддерживают аллокацию места (xfs, ext4, Btrfs. ), данная команда будет выполнена мгновенно, в отличие от dd.
11. xargs
Всего два момента, которые полезны, если мы обрабатываем очень большой список.
Первое — список может просто не влезть в командную строку.
Но мы можем ограничить обработку аргументов через опцию -n:
Второе — команда может выполняться слишком долго, ибо мы запустили ее выполняться в один поток. А если у нас несколько ядер, то полезно запускать xargs в три потока, каждый будет обрабатывать по 2 аргумента:
Если мы хотим запустить на все доступные ядра, то можно даже использовать nproc, скрипт автоматически определит количество доступных ядер на текущей машине:
12. sleep? while? read!
Вместо sleep или бесконечного цикла while, я пишу read, что позволяет одной командой сделать паузу, которую можно в любой момент прервать:
Или добавить таймаут, который также можно в любой момент прервать и продолжить выполнение:
Можно усложнить конструкцию до полноценной обработки:
На этом я прощаюсь, и буду благодарен за участие в опросе.
И конечно — жду разумной критики и новых приемов от вас!
P.S. Update:
1. все переменные заключены в кавычки — так надо!
2. « заменен на $() — так правильно!
3. исправлено несколько опечаток, и даже парочка ошибок.
Всем, кто со мной спорит — несмотря на мою воинственность, я действительно стараюсь услышать и разобраться =), поэтому огромное спасибо+ следующим комментаторам: khim, Tanriol, Himura, bolk, firegurafiku, а также dangerous3, RPG, ALexhha, IRyston, McAaron
Источник