RTFM.WIKI

Ordnung muß sein. Ordnung über alles (18+)

Инструменты пользователя

Инструменты сайта


linux:terminal:terminal_tnt_bash

Трюки в консоли: 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 - важно знать

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

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

Полностью удалить историю Bash

-c - Очистить файл истории
-w - Внести команды текущей сессии в файл с историей

$ history -cw

Удалить определенную строку из истории Bash

d - Удалить строку с указанным номером из истории

$ history -dw 352

Очистить историю команд текущей сессии

-r - Прочитать файл с текущие историей и добавить его содержимое к списку истории команд

$ history -r

Не сохранять команду в истории Bash

Выполнить команду не занося ее в историю Bash:

$ <пробел>команда

Обсуждение

Ваш комментарий. Вики-синтаксис разрешён:
 
linux/terminal/terminal_tnt_bash.txt · Последнее изменение: 2021/11/22 15:17 — dx