linux

Bash: Передача аргументов в кавычках

Мне потребовалось создать скрипт, который передает свои аргуенты на вход другого скрипта без изменения. Просто добавляет к ним несколько своих параметров.

#!/usr/bin/env bash
some_tools $@

На этом этапе меня подстерегал сюрприз. Если в строке аргументов были кавычки, то интерпретатор просто отбрасывал их.
Выяснилось, что для передачи строкового литерала без изменений надо обернуть его в двойные кавычки.

#!/usr/bin/env bash
some_tools "$@"
HowTo, linux

Bash: подстановка процесса

2018-07-03-22:14:15_267x133Рассмотрим достаточно полезную штуку в консоли линукса (bash) как подстановка процесса.

Вообще подстановок в баше достаточно много всяких подстановок: результата выполнения команды  арифметических операций, имен файлов, значений переменных и, конечно же, процессов.

Применима подстановка в первую очередь для того, чтобы избавиться от создания пайпов.А во вторую — для сохранения внешнего контекста при работе подпроцесса.

Избавляемся от пайпов

Имеем две команды, которые формируют некоторый список значений и мы хотим сделать diff или любую другую операцию, которая принимает на вход в качестве аргументов имена файлов.

Читать далее

linux

Linux: определяем тип файла

2018-04-28-22:37:39_718x635В попытках открыть csv-файл от одной организации я увидел картину из скриншота. В файле должны были быть табличные данные, а оказалась какая-то белиберда с отсылкой к VBA. Очевидно, что там что-то из msоffice, но как узнать это точно?

Для определения типа файла по его сигнатуре в unix-подобных операционных системах существует утилита file (man 1 file).

 $ file test.csv
test.csv: Composite Document File V2 Document, Little Endian, Os: Windows, Version 5.2, Code page: 1251, Author: , Last Saved By: , Name of Creating Application: Microsoft Excel, Create Time/Date: Sat Apr 28 10:33:01 2018, Last Saved Time/Date: Sat Apr 28 10:45:37 2018, Security: 0

Видно, что тип файла Composite Document File V2 Document. Но какой именно это формат? У экселя их очень много. Есть отличная утилита unoconv из поставки openoffice/libreoffice.

 $ sudo dnf install unoconv
 $ mv test.csv test
$ unoconv --format=ods test

Сразу возникает вопрос: зачем мы убрали у файла расширение? Это особенность утилиты: она использует расширение файла для определения типа, а если расширения нет, то опирается на метаинформацию. Поэтому нам потребовалось убрать расширение.

Теперь все хорошо и нормально открывается.

Разработка, HowTo, linux

Обновление нескольких git-репозитариев в папке

2016-03-08-22:48:31_580x134 Порой у нас в каталоге накапливается много-много git-репозитариев, которые хочется обновить в один заход. Для этого есть маленький скрипт, который обновляет все репозитарии, которые сможет найти в папке, переданной в качестве аргумента.

#!/bin/bash

if test "$#" -ne 1; then
    echo "usage: $0 <dirname>"
		echo "Find and update all git repos in specified folder"
    exit 1
fi

if [ -d $1 ]; then
	find $1 -type d -name .git | xargs -n 1 dirname | sort | while read line; do echo "Update repo $line" && pushd `pwd` > /dev/null && cd $line && git pull && popd > /dev/null; done
else
	echo "\"$1\" does not exists"
fi

Использование очень простое

$ gitup ~/projects

Репозитарий на github.

Разработка, linux

Bash: копирование файлов из списка

Copy files (screenshot) Задача: у нас есть файл со списком стилей/скриптов/бинарников (нужное подчернуть) которые надо скопировать или переместить в другое место.
Да. Такие задачи бывают. 🙂

Допустим выглядит файл как-то так

$ cat css.txt 
css/reset-ls.css
css/b-browser.css
css/reg-form.css
css/old/pop-up.css

Пути либо относительные, либо полные.

Скопировать все в новый локейшн можно простым однострочником

$ for i in $(cat css.txt); do cp $i /tmp/; done
HowTo

Многопоточная компрессия и tar

Сколько можно? 🙂 Ядер все больше и больше, а

$ tar -cjf /mnt/_backup/`date '+%Y-%m-%d_%H-%M-%S'`.tbz2 /home

как работал в один поток, так и работает.

Есть два многопоточных решения:

  • pbzip2 — параллельный bzip
  • pigz — параллельный gzip
$ tar -c /home | pbzip2 -vc -9 -p7 /mnt/_backup/`date '+%Y-%m-%d_%H-%M-%S'`.tbz2

Опцией -p# можно управлять количеством ядер, которые будет использовать архиватор. Нормально — это N-1.

Аналогично и для gzip

$ tar -c /home | pigz -vc -9 -p7 /mnt/_backup/`date '+%Y-%m-%d_%H-%M-%S'`.tbz2

С удивлением открыл для себя, что — в bash по дефолту означает stdout. И

$ tar -cf - file

будет использовать в качестве файла stdout. 🙂

HowTo

Делаем подсветку синтаксиса для less

Подсветка синтаксиса в lessДефолтный вывод less  в консоли чрезвычайно скучный. И рассматривать километры одинаковых черно-белых листингов утомляет (или зеленых если у вас Ъ-хакерский терминал :)).

Так привнесем же цветность в наши черно-белые терминал.

 $ sudo yum install python-pygments

А затем прописываем в .bashrc

export LESS="-R"
export LESSOPEN="|pygmentize -g -O encoding=utf8 %s"

Кодировку ставим на выбор. Но если чаще всего работаем в юникоде, то и оставляем юникод.

При этом будет подсвечиваться только вывод less, который вызван в дефолтной форме

 $ less filename

Вывод же less, который работает с перенаправленным вводом подсвечиваться на будет. 🙂

Проект pygments.