Содержание
Трюки в консоли: Bash
console
/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 — символ возврата каретки
CR и LF это управляющие символы en ru или байт-код которые можно использовать для обозначения разрыва строки в текстовых файлах.
- CR = Возврат каретки (Carriage Return) (
\r
,0x0D
в шестнадцатеричной, 13 в десятичной системе счисления) — перемещает курсор в начало строки, не переходя на следующую строку. - LF = Перевод строки (Line Feed) (
\n
,0x0A
в шестнадцатеричной, 10 в десятичной системе счисления — перемещает курсор на следующую строку, не возвращаясь в начало строки.
CR, за которым сразу следует LF (CRLF, \r\n
, или 0x0D0A
) перемещает курсор на следующую строку и затем перемещает его в начало строки.
А еще есть утилита tr
cat script.sh | tr -d '\r' > script-fixed.sh
Перевод поста Why is the line terminator CR+LF? от GunSmoker-а
Этот протокол восходит к временам телетайпов.
CR - это аббревиатура для "carriage return" (возврат каретки) - управляющий символ CR возвращал печатающую головку ("carriage") к нулевой колонке без движения бумаги. LF - это аббревиатура для "linefeed" (подача бумаги) - управляющий символ LF сдвигал бумагу на одну строчку без движения каретки. Поэтому, если вы хотели вернуть головку к нулевой колонке (чтобы быть готовым печатать на новой строчке) и сдвинуть бумагу (чтобы печатать на чистом месте), то вам нужны были и CR и LF.
Если вы посмотрите на большинство интернет протоколов, таких как RFC 0821 (SMTP), RFC 1939 (POP), RFC 2060 (IMAP) или RFC 2616 (HTTP), то вы увидите, что все они указывают пару CR+LF как последовательность, терминирующую строки. Поэтому на самом деле вопрос звучит не как "Почему CP/M, MS-DOS и Win32 используют CR+LF как разделитель строк?", а скорее как "Почему другие люди решили взять другой разделитель, отличный от этих стандартов?".
Unix принял в качестве разделителя строк простой LF. Если вы посмотрите на опции 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 и другие настройки
.bash_profile vs .bashrc - важно знать
Добавляем в ~/.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
Добавить время в 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
Полностью удалить историю Bash
-c - Очистить файл истории
-w - Внести команды текущей сессии в файл с историей
$ history -cw
Удалить определенную строку из истории Bash
d - Удалить строку с указанным номером из истории
$ history -dw 352
Очистить историю команд текущей сессии
-r - Прочитать файл с текущие историей и добавить его содержимое к списку истории команд
$ history -r
Не сохранять команду в истории Bash
Выполнить команду не занося ее в историю Bash:
$ <пробел>команда
Обсуждение