Интересно, полагаю, только юниксоидам и шеллописателям, поэтому под кат.
У меня подобного тому, что написано ниже, в голове много, но, как показывает практика, много никогда не бывает. Вот сегодняшние находки (впрочем, третья старая, просто сегодня ещё раз столкнулся с).
(1) ls при выводе в пайп пишет по одному файлу на строчку (то есть как ls -1). Очевидным становится, если подумать, что ls интересуется размером терминала в ширину, чтобы понять, сколько файлов в одну строчку можно втиснуть. Если терминала нет, то и ширина нулевая, поэтому есть печатаем по одному.
Следствие: в конструкции вида ls -1 | что-то там опция -1 в принципе не нужна.
(2) grep с аргументом "что ищем" в виде многострочного выражения понимает его как "искать любую из этих строк". То есть выражения вида
grep 'one
two
three'
и
grep -E 'one|two|three'
идентичны (опция -E нужна, чтобы grep понимал |, то есть вертикальную палку, то есть "или").
Следствие: в скриптах можно не заморачиваться с сочинением строчки из параметров, разделённых палкой (и не забывать, что в конце палка не нужна, иначе поматчится всё), можно делать просто через новую строку (и неважно, есть там пустые строки или нет).
(3) опция -e для echo является непортабельной. Вот, например, как ведёт себя dash(дефолтный шелл в Debian и Ubuntu) и bash:
$ /bin/bash -c 'echo -e xxx\\nyyy'
xxx
yyy
$ /bin/dash -c 'echo -e xxx\\nyyy'
-e xxx
yyy
Теперь уберём -e и посмотрим ещё раз:
$ /bin/bash -c 'echo xxx\\nyyy'
xxx\nyyy
$ /bin/dash -c 'echo xxx\\nyyy'
xxx
yyy
Следствие: надо использовать printf или хотя бы писать #!/bin/bash в начале скрипта.
век живи, век учись
какое-нибудь убунту 10.4? у меня вот что: Дебиан сквиз Лол, только что столкнулся с такой проблемой. Есть скрипт для копирования из urxvt: |