====== Трюки в консоли: 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:
$ <пробел>команда