k001
k001
:...

April 2032
        1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30

k001 [userpic]
век живи, век учись

Интересно, полагаю, только юниксоидам и шеллописателям, поэтому под кат.

У меня подобного тому, что написано ниже, в голове много, но, как показывает практика, много никогда не бывает. Вот сегодняшние находки (впрочем, третья старая, просто сегодня ещё раз столкнулся с).

(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 в начале скрипта.

Tags: ,
Comments


~ % /bin/bash -c '/bin/echo -e h'
h
~ % /bin/dash -c '/bin/echo -e h'
h

какое-нибудь убунту 10.4? у меня вот что:


$ rpm -q dash$ rpm -q dash fedora-release
dash-0.5.5.1-3.fc12.x86_64
fedora-release-12-2.noarch

Проглядел...

Дебиан сквиз

~ % aptitude show dash
Package: dash
Essential: yes
State: installed
Automatically installed: yes
Version: 0.5.5.1-3
Priority: required
Section: shells
Maintainer: Gerrit Pape <pape@smarden.org>
Uncompressed Size: 242k
Depends: debianutils (>= 2.15), dpkg (>= 1.15.0)
PreDepends: libc6 (>= 2.3)
Description: POSIX-compliant shell
The Debian Almquist Shell (dash) is a POSIX-compliant shell derived from ash.

Since it executes scripts faster than bash, and has fewer library dependencies (making it more robust against software or hardware
failures), it is used as the default system shell on Debian systems.
Homepage: http://gondor.apana.org.au/~herbert/dash/

~ % aptitude show bash
Package: bash
Essential: yes
State: installed
Automatically installed: no
Version: 4.1-3
Priority: required
Section: shells
Maintainer: Matthias Klose <doko@debian.org>
Uncompressed Size: 3,621k
Depends: base-files (>= 2.1.12), debianutils (>= 2.15)
PreDepends: dash (>= 0.5.5.1-2.2), libc6 (>= 2.4), libncurses5 (>= 5.7+20100313)
Recommends: bash-completion (>= 20060301-0)
Suggests: bash-doc
Conflicts: bash-completion (< 20060301-0)
Replaces: bash-completion (< 20060301-0), bash-doc (<= 2.05-1)
Description: The GNU Bourne Again SHell
Bash is an sh-compatible command language interpreter that executes commands read from the standard input or from a file. Bash also
incorporates useful features from the Korn and C shells (ksh and csh).

Bash is ultimately intended to be a conformant implementation of the IEEE POSIX Shell and Tools specification (IEEE Working Group 1003.2).

The Programmable Completion Code, by Ian Macdonald, is now found in the bash-completion package.
Homepage: http://tiswww.case.edu/php/chet/bash/bashtop.html


Дело в том, что есть юниксовая программа echo, а есть встроенное в шелл дерьмо (вроде бы)

Лол, только что столкнулся с такой проблемой. Есть скрипт для копирования из urxvt:

#! /usr/bin/perl

sub on_sel_grab {
my $query=quotemeta $_[0]->selection;
$query=~ s/
/\n/g;
$query=~ s/
/\r/g;
system( "echo -en " . $query . " | xsel -i -b -p" );
}



Так вот, при копировании в начале текста получается '-en', если поставить /bin/echo - все работает

Вообще-то posix как бы намекает нам "New applications are encouraged to use printf instead of echo."