Пара мелочей о терминале в Linux
История и дубликаты
Чтобы, во время листания истории введённых команд (стрелками на клавиатуре), терминал не предлагал вам одни и те же строки-дубликаты добавьте к .bashrc это:
export HISTCONTROL=ignoreboth:erasedups
Autocomplete
Если у вас имеется некий большой скрипт, и вы всё никак не можете уложить в голове все его многочисленные параметры, то можно создать свой собственный autocomplete-список для этого скрипта/программы. Сами скрипты обычно кладутся в ~/.bash_completion.d, но это зависит от настроек вашей системы и профиля. Можно сделать, к примеру так (.bashrc):
if [ -f /etc/bash_completion ] && ! shopt -oq posix; then . your_script's_path fi
Где вместо your_script's_path путь к вашему скрипту. В самом скрипте уже может быть всё что угодно. Самый простой вариант с заранее заготовленными строками для автокомплита (бездумного):
complete -W "option1 option2 option3" your_program
Это приведёт к тому, что вбив "your_program " и нажав Tab дважды вам будут предложены все три опции. Если же нужно что-то хитрее, например специфическую фильтрацию, то можно указать отдельный метод, для обработки уже введённых символов. Или, скажем, вам может потрбоваться в качестве списка вариантов список директорий/файлов в каком-то конкретно заданном месте.
_your_program() { local cur=${COMP_WORDS[COMP_CWORD]} COMPREPLY=( $(compgen -W " $( ls some_directory's_path )" -- $cur) ) } complete -F _your_program your_program
Этот код позволит по Tab-у получать в помощь список файлов из some_directory's_path.
#!/bin/sh
Столкнулся с тем, что указывая вначале bash-скриптов этот интерпретатор, часть правильно записанных bash-команд не срабатывает, а ругается с ошибками. Оказалось всё дело в том, что в Ubuntu-based дистрибутивах в качестве sh-интерпретатора используется некий dash, и он не в полной мере совместим с bash. Поменяв sh на bash в этой строке проблемы испарились.
В моём случае dash ругался на:
DIR=$(dirname "$(readlink -f "$0")")
Эта строка, кстати, аналог получения __dirname.