Разделение строки на составляющие в шелле

Во многих языках программирования есть удобная команда split, которая позволяет разбить строку на составляющие. Для осуществления этой операции в шелле, есть удобная утилита tr, с помощью которой можно делать то же самое. Этим, например, можно пользоваться чтобы преобразовать содержимое переменной $PATH к читабельному виду

{{{ lang=bash line=1
> echo $PATH | tr “:” “\n”
/usr/local/bin
/usr/bin
/bin
/opt/bin
/usr/games/bin
}}}

Первый аргумент (в данном случае “:”) это литера которую нужно заменить, второй аргумент это литера на которую нужно заменить. В данном случае символ-разделитель отдельных элементов $PATH, заменяется на символ перевода строки, что и приводит к нужному результату.

Полное копирование в zsh

Если пытаться скопировать содержимое директории в шелле в какую-либо другую директорию, то могут возникнуть проблемы, связанные с наличием скрытых файлов, то есть файлов, начинающихся со знака точки (‘.’). То есть, если выполнить следующую серию команд:

{{{lang=bash line=1
> cd /tmp
> mkdir a
> mkdir b
> touch a/a
> touch a/b
> touch a/.c
> touch a/.d
}}}

то в директории a будут находиться скрытые файлы. Попытка “в лоб” скопировать содержимое этой директории к успеху не приведёт

{{{lang=bash line=1
> cp a/* b
2 files ( 0,0 KiB) copied in 0,0 seconds ( 0,0 KiB/s).
> ls -al b
a b
> ls -al a
.c .d
}}}

Как видно, в директорию b скопировалось всего два файла. Это связано с тем, как zsh интерпретирует знак ‘*’, он не расшифровывает его в скрытые имена файлов. Конечно, эту проблему можно обойти в два копирования

{{{lang=bash line=1
> cp a/* a/.* b
4 files ( 0,0 KiB) copied in 0,0 seconds ( 0,0 KiB/s).
}}}

но гораздо более изящным является следующий способ
{{{lang=bash line=1
> cp a/*(D) b
4 files ( 0,0 KiB) copied in 0,0 seconds ( 0,0 KiB/s).
}}}

Модификатор (D) указывает zsh, что при раскрытии символа ‘*’ необходимо учитывать также и скрытые файлы.