В составе Vim устанавливается утилита vimdiff
для сравнения содержимого файлов.
$ vimdiff file1.txt file2.txt
При этом в Vim открываются два окна с файлами, где цветом выделены различия в строках этих файлов.
Также запустить Vim в этом режиме можно с помощью ключа -d
:
$ vim -d file1.txt file2.txt
После установки Neovim команда vimdiff
недоступна, открыть файлы в режиме сравнения можно только по ключу -d
:
$ nvim -d file1.txt file2.txt
Можно сделать псевдоним alias vimdiff='nvim -d'
и поместить его в ~/.zshrc
.
Есть альтернативный способ включить режим сравнения файлов. Открываем два файла в разделенных по вертикали окнах и в каждом буфере выполняем команду :diffthis
.
Отключить режим выделения различий можно командой :diffof
.
При установке SQLite из стандартного репозитория Ubuntu командой sudo apt install sqlite3
мы получаем старую версию.
Если нужна самая последняя версия SQLite, можно установить ее из исходных кодов на официальной странице https://www.sqlite.org/download.html.
Сначала установим нужные инструменты:
sudo apt-get install build-essential tar wget
На 07 сентября 2022 года актуальна версия 3.39.03, исходники для нее берем из файла sqlite-autoconf-3390300.tar.gz. Скачиваем этот файл к себе на машину в каталог ~/sqlite.
mkdir sqlite
cd sqlite
wget https://www.sqlite.org/2022/sqlite-autoconf-3390300.tar.gz
Извлекаем из архива файлы:
tar xvfz sqlite-autoconf-3390300.tar.gz
Переходим в созданный каталог:
cd sqlite-autoconf-3390300
Настраиваем код для запуска компиляции:
./configure
Компилируем SQLite командой make
:
make
Устанавливаем скомпилированное приложение:
soudo make install
Программа должна установиться, проверим версию:
sqlite3 --version
После установки в SQLite не работало перемещение по истории команд стрелками вверх/вниз. Для исправления этого поведения установил утилиту rlwrap.
sudo apt-get install rlwrap
Добавил в .zshrc псевдоним:
alias sqlite3="rlwrap sqlite3"
После этого команды из истории текущего сеанса стали перебираться стрелками вверх/вниз.
Консольная утилита bat
для просмотра файлов расширяет возможности стандартной cat
:
Установка:
sudo apt install bat
По умолчанию вызывается как команда batcat
, чтобы не было конфликта с существующим пакетом bakula-console-qt
.
Можно сделать симлинк (ярлык) на bat
:
mkdir -p ~/.local/bin
ln -s /usr/bin/batcat ~/.local/bin/bat
Список файлов, которые открывались в редакторе, показывает команда :ol[dfiles]
. Список упорядочен по хронологии.
Зная номер n
файла, можно его открыть в нормальном режиме в новом буфере, нажав 'n
.
Команда :bro[wse] ol[dfiles]
выводит тот же MRU-список и после нажатия <ESC>
или q
позволяет ввести номер файла для открытия его в новом буфере.
При работе с Markdown-файлами Vim выделяет слова с дополнительным
форматированием (например, наклонный и полужирный шрифт или программный
код
), при этом сами ограничивающие символы (*, _, `) на экране не видны.
К сожалению, иногда границы выделения определяются в редакторе неправильно,
также неудобно набирать слова, начинающиеся с подчеркивания. В этих случаях
отсутствие на экране ограничивающих символов только мешает, а не помогает.
Справиться с этой проблемой очень просто — достаточно отключить подсветку
синтаксиса командой :syntax off
, после чего на экране отобразятся
все символы и можно будет понять, правильно ли сделана разметка текста.
Перевод поста Brian Storti “Understanding Shell Script’s idiom: 2>&1”
Идиома — устойчивое выражение, поговорка или речевой оборот, понятный всем носителям языка. Перевести идиому можно, но понять, о чем идет речь, человеку, который изучает данный язык в качестве иностранного, будет трудно, потому что значение идиомы не вытекает из значения ее слов.
Идиома программирования — устойчивый способ выражения некоторой составной конструкции в одном или нескольких языках программирования. Идиома является шаблоном решения задачи, записи алгоритма или структуры данных путём комбинирования встроенных элементов языка.
Работая с языком программирования или сценариев, мы постоянно используем
некоторые идиомы — конструкции, которые выполняют определенные действия,
решают какую-то распространенную задачу. В скриптах оболочки довольно
распространенной и не всегда хорошо понимаемой идиомой является 2>&1
, как в
примере ls foo > /dev/null 2>&1
Позвольте мне объяснить, что здесь
происходит и почему это работает именно так.
Перенаправление — это механизм, используемый для отправки вывода команды в
другое место. Например, если мы применяем команду cat
к файлу, то вывод этой
команды по умолчанию будет отображаться на экране:
$ cat foo.txt
foo
bar
baz
Мы можем перенаправить этот вывод в другое место, например, в файл output.txt:
$ cat foo.txt > output.txt
$ cat output.txt
foo
bar
baz
Отметим, что после первого выполнения команды cat
на экран ничего не было
выведено, так как мы изменили размещение стандартного выходного потока
(stdout
) с экрана на файл.
Также важно знать, что есть стандартный поток ошибок (stderr), в который
консольные программы посылают сообщения о возникающих ошибках. Например,
попытаемся применить команду cat
к несуществующему файлу:
$ cat nop.txt > output.txt
cat: nop.txt: No such file or directory
Несмотря на то, что мы перенаправили stdout
в файл, мы по-прежнему видим
сообщения об ошибках на экране. Это правильно, так как мы перенаправили только
выходной поток, а не поток ошибок.
Дескриптор файла — это положительное целое число, которое операционная система назначает открытому файлу. Если у вас открыто 100 файлов, то для них будут созданы 100 дескрипторов.
Замечание. В Unix-системах все является файлом, в том числе стандартные потоки
ввода и ошибок. Поэтому для потоков stdout
и stderr тоже определены файловые
дескрипторы, причем с фисксированными номерами: 1 для sdtout и 2 для stderr.
Вернемся к нашему первому примеру с перенаправлением cat foo.txt
в файл
output.txt. Теперь мы можем переписать эту команду так:
$ cat foo.txt 1> output.txt
Здесь число 1 означает файловый дескриптор для stdout
.
Аналогичным образом, чтобы перенаправить поток ошибок stderr
, нужно перед
оператором перенаправления >
указать файловый дескриптор с номером 2:
# Использование файлового дескриптора (2) потока stderr для перенаправления сообщений об ошибках в файл
$ cat nop.txt 2> error.txt
$ cat error.txt
cat: error.txt: No such file or directory
Теперь вы уже, наверное, догадываетесь, что делает идиома 2>&1
?
Запись &1
означает значение файлового дескриптора 1 (stdout
). Поэтому
выражение 2>&1
означает, что stderr
(2) перенаправляется в то же место,
куда был перенаправлен stdout
(1):
$ cat foo.txt > output.txt 2>&1
$ cat output.txt
foo
bar
baz
$ cat nop.xt > output.txt 2>&1
$ cat output.txt
cat: nop.txt: No such file or directory
stdout
) и стандартный поток ошибок (stderr
).stdout
соответсвует файловый дескриптор 1, потоку stderr
— файловый дескриптор 2.command > output
является сокращением для command 1> output
.&[FILE_DESCRIPTOR]
.2>&1
перенаправит stderr
туда же, куда направлен stdout
.