====== Трюки в консоли: Bash ====== {{mdi>console?48&align=right}} {{tag>bash tnt}} ==== /bin/sh^M: bad interpreter ==== Ошибка **/bin/sh^M: bad interpreter: No such file or directory** TL;DR sed -i -e 's/\r$//' prikol.sh или apt install dos2unix dos2unix prikol.sh К нам в Linux логово прокрался ужасный символ из мира Шиндоус - **^M** — символ возврата каретки Из [[https://developer.mozilla.org/ru/docs/Glossary/CRLF|глоссария Мозиллы]] CR и LF это управляющие символы [[https://en.wikipedia.org/wiki/Control_character|en]] [[https://ru.wikipedia.org/wiki/Управляющие_символы|ru]] или [[https://en.wikipedia.org/wiki/Bytecode|байт-код]] которые можно использовать для обозначения разрыва строки в текстовых файлах. * CR = **Возврат каретки (Carriage Return)** (''\r'', ''0x0D'' в шестнадцатеричной, 13 в десятичной системе счисления) — перемещает курсор в начало строки, не переходя на следующую строку. * LF = **Перевод строки (Line Feed)** (''\n'', ''0x0A'' в шестнадцатеричной, 10 в десятичной системе счисления — перемещает курсор на следующую строку, не возвращаясь в начало строки. CR, за которым сразу следует LF (CRLF, ''\r\n'', или ''0x0D0A'') перемещает курсор на следующую строку и затем перемещает его в начало строки. А еще есть утилита **[[https://ru.wikipedia.org/wiki/Tr|tr]]** cat script.sh | tr -d '\r' > script-fixed.sh [[https://www.transl-gunsmoker.ru/2009/03/crlf.html|Перевод поста]] [[http://blogs.msdn.com/oldnewthing/archive/2004/03/18/91899.aspx|Why is the line terminator CR+LF?]] от GunSmoker-а Этот протокол восходит к временам телетайпов. CR - это аббревиатура для "carriage return" (возврат каретки) - управляющий символ CR возвращал печатающую головку ("carriage") к нулевой колонке без движения бумаги. LF - это аббревиатура для "linefeed" (подача бумаги) - управляющий символ LF сдвигал бумагу на одну строчку без движения каретки. Поэтому, если вы хотели вернуть головку к нулевой колонке (чтобы быть готовым печатать на новой строчке) и сдвинуть бумагу (чтобы печатать на чистом месте), то вам нужны были и CR и LF. Если вы посмотрите на большинство интернет протоколов, таких как [[http://www.ietf.org/rfc/rfc0821.txt|RFC 0821 (SMTP)]], [[http://www.ietf.org/rfc/rfc1939.txt|RFC 1939 (POP)]], [[http://www.ietf.org/rfc/rfc2060.txt|RFC 2060 (IMAP)]] или [[http://www.ietf.org/rfc/rfc2616.txt|RFC 2616 (HTTP)]], то вы увидите, что все они указывают пару CR+LF как последовательность, терминирующую строки. Поэтому на самом деле вопрос звучит не как "Почему CP/M, MS-DOS и Win32 используют CR+LF как разделитель строк?", а скорее как "Почему другие люди решили взять другой разделитель, отличный от этих стандартов?". Unix принял в качестве разделителя строк простой LF. Если вы посмотрите на [[http://www.opennet.ru/man.shtml?topic=stty&category=1&russian=4|опции stty]], то увидите, что опция onlcr указывает, следует ли менять LF на CR+LF. Если вы установите эту опцию неверно, то вероятнее всего получите текст "лесенкой", где каждая строка начинается там, где закончилась предыдущая. Так что даже Unix может требовать CR+LF для разделения строк. Неявный CR перед LF - это изобретение Unix, вероятно с целью экономии одного байта на строчку. Unix является "папой" языка C, поэтому стандарт языка C унаследовал это соглашение: разделителем строк в языке является один символ "\n" (что есть LF). Это загружает runtime библиотеки дополнительной работой по преобразованию одиночных символов в разделители строк. Также язык C предложил термин "newline" для выражения концепции "общего разделителя строк". Я слышал, что комитет ASCII изменил название символа $0A (LF) на "newline" примерно в 1996, так что уровень запутанности возрос ещё выше. ===== Размер истории bash и другие настройки ===== [[http://www.joshstaiger.org/archives/2005/07/bash_profile_vs.html|.bash_profile vs .bashrc]] - важно знать [[https://gahcep.github.io/blog/2012/07/28/unix-bash-shell-prompt/|PROMPT_COMMAND]] Добавляем в ''~/.bashrc'' # вывод даты и времени export HISTTIMEFORMAT="%h %d %H:%M:%S " # количество команд, сохраняемых в истории, дефолт 500 export HISTSIZE=10000 # количество строк, сохраняемых в истории, дефолт 500 export HISTFILESIZE=10000 # дополнять историю, а не перезаписывать | xgu.ru/wiki/shopt shopt -s histappend # все строки многострочной команды рассматриваются, как одна shopt -s cmdhist # записывать историю сразу после ввода команды PROMPT_COMMAND="history -a; $PROMPT_COMMAND" # ignorespace - не сохранять строки начинающиеся с пробела # ignoredups - не сохранять строки, совпадающие с последней выполненной командой # ignoreboth - использовать обе опции 'ignorespace' и 'ignoredups' # erasedups - удалять ВСЕ дубликаты команд с истории # можно комбинировать: # export HISTCONTROL=ignorespace:erasedups export HISTCONTROL= ignoreboth # не сохранять команды top, history, ping export HISTIGNORE="top:history:ping" # кастомный файл истории команд export HISTFILE=~/.custom_bash_hist_file [[https://stackoverflow.com/questions/19454837/bash-histsize-vs-histfilesize|HISTSIZE vs. HISTFILESIZE?]] ===== Добавить время в history ===== Добавляем в ''~/.bashrc'' **$ export HISTTIMEFORMAT="%h %d %H:%M:%S "** 1172 Apr 07 14:52:56 ifconfig 1173 Apr 07 14:53:21 df -h 1174 Apr 07 14:53:32 free -m или **export HISTTIMEFORMAT="%d/%m/%y %T "** 1175 07/04/20 14:54:45 yum check-update 1176 07/04/20 14:55:00 rm -rf /* 1177 07/04/20 14:55:10 man backups ===== Debug/verbose для git ===== GIT_CURL_VERBOSE=1 GIT_TRACE=1 git pull origin master ===== Статистика популярности использования команд на основании history ===== history|awk '{print $2}'|sort|uniq -c|sort -rn|head -20|awk '!max{max=$1;}{r="";i=s=60*$1/max;while(i-->0)r=r"#";printf "%15s %5d %s %s",$2,$1,r,"\n";}' ===== Не сохранять историю в bash ===== Как вводить команды и быть увереным, что они не логируются? Просто добавь воды пробел [space]ls -la /home Выйти из bash без сохранения истории и оставить предыдущие команды в истории нетронутыми unset HISTFILE && exit Полностью удалить историю bash и выйти history -c && exit ===== Не сохранять историю в bash ЧАСТЬ 2 ===== Как **полностью** удалить историю bash_history cat /dev/null > ~/.bash_history && history -c && exit или history -c && history -w ===== Как вывести полную дату для команды last ===== last -F Ключ ''-F'' - Print full login and logout times and dates. reboot system boot 2.6.32-573.22.1. Thu Jan 26 09:48:36 2017 - Sun May 27 17:39:39 2018 (486+07:51) reboot system boot 2.6.32-573.22.1. Thu Jan 26 09:48 - 17:39 (486+07:51) === Как очистить историю команд в bash === via [[https://bogachev.biz/2014/11/04/Как-очистить-историю-команд-в-Bash|https://bogachev.biz/2014/11/04/Как-очистить-историю-команд-в-Bash]] **Полностью удалить историю Bash** **-c** - Очистить файл истории\\ **-w** - Внести команды текущей сессии в файл с историей $ history -cw **Удалить определенную строку из истории Bash** **d** - Удалить строку с указанным номером из истории $ history -dw 352 **Очистить историю команд текущей сессии** **-r** - Прочитать файл с текущие историей и добавить его содержимое к списку истории команд $ history -r **Не сохранять команду в истории Bash** Выполнить команду не занося ее в историю Bash: $ <пробел>команда