Нужна помощь в написании скрипта.

На самом деле это единственный раздел про unix на этом форуме

Модераторы: /dev/random, Модераторы разделов

Аватара пользователя
ZyX
Сообщения: 355
ОС: Gentoo

Re: Нужна помощь в написании скрипта.

Сообщение ZyX »

drBatty писал(а):
17.04.2012 10:14
дело не в for, а в звёздочке:
1. она _может_ раскрыться не полностью, и на практике лично я такое наблюдал.
2. перед звёздочкой надо по уму проверить, не является-ли каталог пустым. Иначе в этой вполне штатной ситуации звёздочка не раскроется, и если она в КС, то сама звёздочка и передастся, а если она в for in *, то передастся пустая строка.

$

for f in *; do echo "i='$i'"; done i='' echo * *


3. поведение звёздочки почти не регулируемое. В частности она не отличает каталоги от файлов, не понимает, что симлинк это не обычный файл, и не видит скрытых файлов.
4. Звёздочка выдаёт не просто список файлов, а отсортированный список. Практически всегда это не нужно. Какой смысл тратить ресурсы на ненужную сортировку? (если каталог большой, то ресурсы не малые, ибо сортировать надо "на месте", а это O(N*log(N)) по времени, и ещё O(N) по памяти).
sgfault писал(а):
13.04.2012 23:35
А с вашим любимым find-ом, кстати, будет куча проблем с симлинками.

вот как раз с find никаких проблем и не будет: есть там опции -P, -L, и -H, которые позволяют мне обрабатывать симлинки именно так, как _мне_ это нужно. А не как звёздочка, которая (не)раскрывается так, как _она_ хочет.
sgfault писал(а):
13.04.2012 23:35
Конечно, к вашему варианту это не относится, тк вы предусмотрительно написали '-type f'. Но просто обычно выкидывать симлинки - не самое лучше, чем можно заниматься на АФ что можно придумать. Все-таки.

ну не нравится такое поведение - поменяйте. К вашему распоряжению кроме упомянутых H,L,P есть ещё xtype & follow. Для звёздочки всего этого нет, и не будет...

Что интересно, всё это есть в zsh:
1. Если вы имеете ввиду файлы, начинающиеся с точки, то на это есть GLOB_DOTS, временно устанавливаемая с помощью (D): * выведет все файлы, не начинающиеся с точки, *(D) — вообще все.
2. Если использовать настройку NULL_GLOBS, то в пустом каталоге она раскроется в пустой список (по умолчанию это ошибка, предотвращающая запуск команды вообще, хотя можно сделать и как в bash). Локально это устанавливается с помощью (N), комбинация с (D) позволяется: *(ND).
3. Тоже есть методы обхода: про скрытые файлы я сказал в п. 1., ограничится только каталогами можно с помощью (/), но если нужно сделать что‐то вроде «каталоги перед файлами», придётся иметь дело с (oe)/(o+) и shell код внутри/свою функцию выше.
4. Сортировка убирается с помощью (oN).
5. Чтобы сделать -L, придётся привлекать (e)/(+) и писать shell код внутри/свою функцию выше, но это возможно.
6. -xtype/-follow соответствует применению (-) для всех последующих квалификаторов.

zsh здесь медленнее, да. Но со звёздочкой можно сделать то, что find и не снилось, хотя кое‐где с find то же самое будет удобнее.

Так что прежде, чем говорить «нет, и не будет», попробуйте zsh. *(D/) набирается гораздо быстрее, чем find -type d, используется легче, а на сколько мс это будет медленнее отрабатывать на моих задачах без разницы.
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: Нужна помощь в написании скрипта.

Сообщение drBatty »

ZyX
все это так. Но мы про bash. ваши примеры познавательны, но у меня сработают только дома, в продакшене - увы.
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: Нужна помощь в написании скрипта.

Сообщение drBatty »

ZyX писал(а):
18.04.2012 04:24
1. Если вы имеете ввиду файлы, начинающиеся с точки, то на это есть GLOB_DOTS, временно устанавливаемая с помощью (D): * выведет все файлы, не начинающиеся с точки, *(D) — вообще все.

нет. Я имею ввиду то, что в некоторых случаях command * обрабатывает не все файлы, которые _должна_ обрабатывать. А .* она и не должна.
И нигде в мануалах я не нашёл того, что command * _не_ имеет ограничения на количество файлов. А вот, ЕМНИП, для xargs это явно прописано. И действительно, даже когда * у меня не сработала, вариант с xargs отлично справился.
ZyX писал(а):
18.04.2012 04:24
zsh здесь медленнее, да. Но со звёздочкой можно сделать то, что find и не снилось, хотя кое‐где с find то же самое будет удобнее.
Так что прежде, чем говорить «нет, и не будет», попробуйте zsh.

это мне ещё info Z Shell надо осилить, tl;dr.
Зачем это надо, если info find я _уже_ осилил, да ещё и find быстрее? И да, info find таки ещё и покороче будет.
ZyX писал(а):
18.04.2012 04:24
а на сколько мс это будет медленнее отрабатывать на моих задачах без разницы.

а это смотря где применять. Посмотрите на subject - подразумевается, что ТС часок помучается, а потом его скрипт будет годами работать без постороннего усилия. И вполне возможно, что этому скрипту придётся обрабатывать не 10 и не 110 файлов...
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
Аватара пользователя
t.t
Бывший модератор
Сообщения: 7390
Статус: думающий о вечном
ОС: Debian, LMDE

Re: Нужна помощь в написании скрипта.

Сообщение t.t »

sash-kan писал(а):
13.04.2012 10:44
k0rven писал(а):
13.04.2012 08:46
вариант с rsync-ом не перемещал файлы в нужную директорию
про удаление файлов после копирования rsync-ом я написал в первом своём посте·
Если оба каталога находятся на одной ФС, то копирование с удалением -- весьма некрасивый вариант по многим параметрам.
¡иɯʎdʞ ин ʞɐʞ 'ɐнɔɐdʞǝdu qнεиж
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: Нужна помощь в написании скрипта.

Сообщение drBatty »

t.t писал(а):
19.04.2012 14:43
sash-kan писал(а):
13.04.2012 10:44
k0rven писал(а):
13.04.2012 08:46
вариант с rsync-ом не перемещал файлы в нужную директорию
про удаление файлов после копирования rsync-ом я написал в первом своём посте·
Если оба каталога находятся на одной ФС, то копирование с удалением -- весьма некрасивый вариант по многим параметрам.

ИМХО это всё часть какой-то другой задачи. Возможно там вообще mv не к месту...
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
Аватара пользователя
t.t
Бывший модератор
Сообщения: 7390
Статус: думающий о вечном
ОС: Debian, LMDE

Re: Нужна помощь в написании скрипта.

Сообщение t.t »

drBatty писал(а):
19.04.2012 14:49
ИМХО это всё часть какой-то другой задачи. Возможно там вообще mv не к месту...
Какова бы ни была общая задача, копирование вместо переименования в пределах одной ФС она оправдать не может по определению. Или я что-то подзабыл, и rsync в этом случае жёсткие ссылки использует?..
¡иɯʎdʞ ин ʞɐʞ 'ɐнɔɐdʞǝdu qнεиж
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: Нужна помощь в написании скрипта.

Сообщение drBatty »

t.t писал(а):
19.04.2012 14:54
Какова бы ни была общая задача, копирование вместо переименования в пределах одной ФС она оправдать не может по определению.

очевидно - да.
но это всё теория. Напомню первый пост:
k0rven писал(а):
12.04.2012 15:07
Есть каталоги /home/vova/out/ и /home/goga/out/, нужен скрипт, котрый бы проверял каталог /home/vova/out/ на наличие в нем файлов (любых, скрытые не нужны) и перемещал бы их в /home/goga/out/. В дальнейшем этот скрипт планирется запускать cron-ом каждые 15 минут.

ИМХО решение с find самое оптимальное. А имеющиеся у нас решения с mv не удовлетворяют условию, т.к. ничего не проверяют(а вдруг файлов нет?). rsync вроде-бы имеет какие-то плюсы, если в source_dir много старых файлов, которые очевидно переносить никуда не нужно, а нужно просто удалить(особенно если в target_dir вообще много файлов). Хотя тут логичнее использовать mv -u.
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
Аватара пользователя
t.t
Бывший модератор
Сообщения: 7390
Статус: думающий о вечном
ОС: Debian, LMDE

Re: Нужна помощь в написании скрипта.

Сообщение t.t »

А про find я ничего и не говорил. Повторюсь: если мне не изменяет память и rsync действительно _копирует_ данные, то в пределах одной ФС такое решение неоправдано по определению. И по скорости выполнения; и по отказоустойчивости в случае, скажем, нехватки места на ФС; и по нескольким менее значимых параметрам типа износа носителей. Вы пытаетесь это утверждение оспорить? Если да, то не вижу Ваших аргументов; а если нет, то не понимаю, о чём разговор. (:
¡иɯʎdʞ ин ʞɐʞ 'ɐнɔɐdʞǝdu qнεиж
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: Нужна помощь в написании скрипта.

Сообщение drBatty »

что касается rsync, это было не мое предложение, я предложил find. Лично я применяю rsync только удаленно. А мой вопрос связан только с академическим интересом. Спасибо за ответ.
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
Аватара пользователя
ZyX
Сообщения: 355
ОС: Gentoo

Re: Нужна помощь в написании скрипта.

Сообщение ZyX »

drBatty писал(а):
18.04.2012 11:56
ZyX писал(а):
18.04.2012 04:24
1. Если вы имеете ввиду файлы, начинающиеся с точки, то на это есть GLOB_DOTS, временно устанавливаемая с помощью (D): * выведет все файлы, не начинающиеся с точки, *(D) — вообще все.

нет. Я имею ввиду то, что в некоторых случаях command * обрабатывает не все файлы, которые _должна_ обрабатывать. А .* она и не должна.
И нигде в мануалах я не нашёл того, что command * _не_ имеет ограничения на количество файлов. А вот, ЕМНИП, для xargs это явно прописано. И действительно, даже когда * у меня не сработала, вариант с xargs отлично справился.
ZyX писал(а):
18.04.2012 04:24
zsh здесь медленнее, да. Но со звёздочкой можно сделать то, что find и не снилось, хотя кое‐где с find то же самое будет удобнее.
Так что прежде, чем говорить «нет, и не будет», попробуйте zsh.

это мне ещё info Z Shell надо осилить, tl;dr.
Зачем это надо, если info find я _уже_ осилил, да ещё и find быстрее? И да, info find таки ещё и покороче будет.

Всё здесь просматривать не надо: львиная часть это автодополнение и всякие странные вещи вроде ztcp, zftp, календарь, часть слабо отличается от bash.

А «find быстрее» только пока не надо сделать что‐то вроде

(Created by format.vim)

GLOBAL=0 for f in * ; do (( ++GLOBAL )) done


Я уже как‐то наизвращался с этим в bash с её «each command in a pipeline is executed in its own subshell». Ещё в bash не работает read -d$'\0', что тоже нехорошо сказывается на взаимодействии с find.
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: Нужна помощь в написании скрипта.

Сообщение drBatty »

ZyX писал(а):
22.04.2012 21:40
А «find быстрее» только пока не надо сделать что‐то вроде

я не очень понял, что это, и зачем это надо?
ZyX писал(а):
22.04.2012 21:40
Я уже как‐то наизвращался с этим в bash с её «each command in a pipeline is executed in its own subshell».

опять-таки не понимаю, в чём у вас были проблемы.
ZyX писал(а):
22.04.2012 21:40
Ещё в bash не работает read -d$'\0', что тоже нехорошо сказывается на взаимодействии с find.

это типа xargs -0 ?
тоже непонятно, зачем это нужно. Можно пример из жизни?
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
Аватара пользователя
/dev/random
Администратор
Сообщения: 5456
ОС: Gentoo

Re: Нужна помощь в написании скрипта.

Сообщение /dev/random »

ZyX писал(а):
22.04.2012 21:40
Я уже как‐то наизвращался с этим в bash с её «each command in a pipeline is executed in its own subshell».

Извращались, извращались... а до того, что это настраивается, не доизвращались.
Спасибо сказали:
Аватара пользователя
ZyX
Сообщения: 355
ОС: Gentoo

Re: Нужна помощь в написании скрипта.

Сообщение ZyX »

drBatty писал(а):
23.04.2012 08:28
ZyX писал(а):
22.04.2012 21:40
А «find быстрее» только пока не надо сделать что‐то вроде

я не очень понял, что это, и зачем это надо?

Имеется ввиду, что мне надо было изменить глобальную переменную основываясь на данных, выдаваемых find (или содержащихся в файлах, им найденных).
ZyX писал(а):
22.04.2012 21:40
Я уже как‐то наизвращался с этим в bash с её «each command in a pipeline is executed in its own subshell».

опять-таки не понимаю, в чём у вас были проблемы.
Я уже и сам не помню точно. Только то, что мне надо было в этом цикле изменить какую‐то переменную и использовать её после окончания цикла. В zsh это просто работает, хотя, как я помню, где‐то есть описание, когда код всё‐таки выполняется в подоболочке.
ZyX писал(а):
22.04.2012 21:40
Ещё в bash не работает read -d$'\0', что тоже нехорошо сказывается на взаимодействии с find.

это типа xargs -0 ?
тоже непонятно, зачем это нужно. Можно пример из жизни?
Предполагая, что в именах файлов может быть новая строка, а вам не нравиться идея написания скрипта, который не обрабатывает данную ситуацию, это нужно в любой ситуации когда бы вы написали find ... | while read. Я это всегда решаю с помощью for i in {glob} и наличие у zsh множества различных расширений для этих шаблонов мне сильно задачу облегчает. Конкретных примеров я не назову, так как не могу сказать, где в моих скриптах имеет смысл заменить шаблон на find.

/dev/random писал(а):
23.04.2012 19:42
ZyX писал(а):
22.04.2012 21:40
Я уже как‐то наизвращался с этим в bash с её «each command in a pipeline is executed in its own subshell».

Извращались, извращались... а до того, что это настраивается, не доизвращались.

Может и настраивается. Но в zsh — по умолчанию.
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: Нужна помощь в написании скрипта.

Сообщение drBatty »

ZyX писал(а):
27.04.2012 20:23
Я уже и сам не помню точно. Только то, что мне надо было в этом цикле изменить какую‐то переменную и использовать её после окончания цикла.

может быть вы пытались сделать что-то вроде

Код: Выделить всё

while read string; do
  read X # это НЕ работает. В смысле читает из file.txt, а не из консоли.
  passwd me # тоже не работает
done < file.txt

а переменные в цикле ничем не хуже тех, что не в цикле.
ZyX писал(а):
27.04.2012 20:23
Предполагая, что в именах файлов может быть новая строка, а вам не нравиться идея написания скрипта, который не обрабатывает данную ситуацию

мне не нравится, когда у файлов такие имена. То, что EXT3,4 позволяют любые байты кроме / & \0 вовсе не повод их использовать. С пробелами проблем обычно нет, но вот всякие \n и \r корёжат даже вывод ls. Зачем это надо?
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
Аватара пользователя
ZyX
Сообщения: 355
ОС: Gentoo

Re: Нужна помощь в написании скрипта.

Сообщение ZyX »

drBatty писал(а):
27.04.2012 23:50
ZyX писал(а):
27.04.2012 20:23
Я уже и сам не помню точно. Только то, что мне надо было в этом цикле изменить какую‐то переменную и использовать её после окончания цикла.

может быть вы пытались сделать что-то вроде

Код: Выделить всё

while read string; do
  read X # это НЕ работает. В смысле читает из file.txt, а не из консоли.
  passwd me # тоже не работает
done < file.txt

а переменные в цикле ничем не хуже тех, что не в цикле.

Нет, я про

(Created by format.vim)

ABC=1 echo 1 | while read i ; do (( ABC+=i )) echo $ABC done echo $ABC


. Если запускать это в bash, то получите 2, затем 1. Если в zsh, то получите 2, затем 2. А про то, что в этом случае можно использовать < <() я тогда просто не знал (точнее, не знал про <()) (впрочем, идея использования < … после цикла мне всё равно не нравиться: что будет в $i мне надо знать когда я вижу read, а не когда я вижу конец цикла).
ZyX писал(а):
27.04.2012 20:23
Предполагая, что в именах файлов может быть новая строка, а вам не нравиться идея написания скрипта, который не обрабатывает данную ситуацию

мне не нравится, когда у файлов такие имена. То, что EXT3,4 позволяют любые байты кроме / & \0 вовсе не повод их использовать. С пробелами проблем обычно нет, но вот всякие \n и \r корёжат даже вывод ls. Зачем это надо?

При чём тут ext*? Это поддерживает, насколько я знаю, даже NTFS, — любая ФС, соответствующая POSIX. И скрипты тоже должны поддерживать пока это не убрали из стандарта.
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: Нужна помощь в написании скрипта.

Сообщение drBatty »

ZyX писал(а):
28.04.2012 07:21
Если запускать это в bash, то получите 2, затем 1.

да. на первый взгляд неожиданно. Но таки логично...
ZyX писал(а):
28.04.2012 07:21
При чём тут ext*? Это поддерживает, насколько я знаю, даже NTFS, — любая ФС, соответствующая POSIX. И скрипты тоже должны поддерживать пока это не убрали из стандарта.

не все скрипты и не всегда работают с каталогами, в которые пишут кто угодно, и что угодно. как раз наоборот.
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
Аватара пользователя
/dev/random
Администратор
Сообщения: 5456
ОС: Gentoo

Re: Нужна помощь в написании скрипта.

Сообщение /dev/random »

ZyX писал(а):
28.04.2012 07:21
Если запускать это в bash, то получите 2, затем 1. Если в zsh, то получите 2, затем 2.

Поищите опцию lastpipe в man bash.
Спасибо сказали:
Аватара пользователя
Bizdelnick
Модератор
Сообщения: 21433
Статус: nulla salus bello
ОС: Debian GNU/Linux

Re: Нужна помощь в написании скрипта.

Сообщение Bizdelnick »

ZyX писал(а):
27.04.2012 20:23
в zsh — по умолчанию

А если zsh настроен не по умолчанию?
Пишите правильно:
в консоли
вку́пе (с чем-либо)
в общем
вообще
в течение (часа)
новичок
нюанс
по умолчанию
приемлемо
проблема
пробовать
трафик
Спасибо сказали:
Аватара пользователя
ZyX
Сообщения: 355
ОС: Gentoo

Re: Нужна помощь в написании скрипта.

Сообщение ZyX »

Bizdelnick писал(а):
28.04.2012 12:13
ZyX писал(а):
27.04.2012 20:23
в zsh — по умолчанию

А если zsh настроен не по умолчанию?

Именно для этого в начале каждой функции принято писать emulate -L zsh. Насчёт неумолчальной настройки для скриптов: такого быть не должно. .zshrc где все настройки обычно располагаются не загружается для скриптов, а люди, помещающие такого рода настройки в ~/.zshenv или даже в /etc/zshenv, являются сами себе очень злобными буратинами. Да и возможность написать тот самый emulate [-L] zsh никто не отменял.
Спасибо сказали:
Аватара пользователя
ZyX
Сообщения: 355
ОС: Gentoo

Re: Нужна помощь в написании скрипта.

Сообщение ZyX »

/dev/random писал(а):
28.04.2012 12:10
ZyX писал(а):
28.04.2012 07:21
Если запускать это в bash, то получите 2, затем 1. Если в zsh, то получите 2, затем 2.

Поищите опцию lastpipe в man bash.

Меня смущает «and job control is not active». То есть я получаю разный результат в интерактивной и неинтерактивной оболочке. Оно мне надо? Я изредка могу и сложный скрипт в одну строку написать.
Спасибо сказали:
Аватара пользователя
/dev/random
Администратор
Сообщения: 5456
ОС: Gentoo

Re: Нужна помощь в написании скрипта.

Сообщение /dev/random »

ZyX писал(а):
28.04.2012 23:53
Меня смущает «and job control is not active». То есть я получаю разный результат в интерактивной и неинтерактивной оболочке. Оно мне надо? Я изредка могу и сложный скрипт в одну строку написать.

Заключите всю строку в скобки. Это создаст для команды неинтерактивную подоболочку.
Спасибо сказали:
Аватара пользователя
ZyX
Сообщения: 355
ОС: Gentoo

Re: Нужна помощь в написании скрипта.

Сообщение ZyX »

/dev/random писал(а):
29.04.2012 00:31
ZyX писал(а):
28.04.2012 23:53
Меня смущает «and job control is not active». То есть я получаю разный результат в интерактивной и неинтерактивной оболочке. Оно мне надо? Я изредка могу и сложный скрипт в одну строку написать.

Заключите всю строку в скобки. Это создаст для команды неинтерактивную подоболочку.

… и сделает таки изменённые глобальные переменные недоступными для дальнейшего использования.
Спасибо сказали:
Аватара пользователя
/dev/random
Администратор
Сообщения: 5456
ОС: Gentoo

Re: Нужна помощь в написании скрипта.

Сообщение /dev/random »

ZyX писал(а):
29.04.2012 18:08
… и сделает таки изменённые глобальные переменные недоступными для дальнейшего использования.

Разумеется. Но вы же писали:
ZyX писал(а):
28.04.2012 23:53
Я изредка могу и сложный скрипт в одну строку написать.

А в пределах этой "одной строчки" всё будет доступно.

Кроме того, обратите внимание: введите в zsh команду sleep 100 | read foo и попробуйте "заморозить" её через ^Z. Вы получите сообщение: zsh: job can't be suspended. Так вот, это не просто случайный баг. Это следствие вышеописанного поведения zsh. Принципиально несовместимые фичи: либо управление задачами, либо получение переменных из пайпа. Разработчики zsh предпочли в таких случаях отключать управление задачами. Да, в bash тоже есть случаи, когда оно отключается, но их гораздо меньше. И знаете, я предпочитаю, чтобы оно работало как можно в большем числе случаев. Меня и в баше-то случаи его отключения раздражают, а с вашим zsh я бы повесился.
Спасибо сказали:
Аватара пользователя
ZyX
Сообщения: 355
ОС: Gentoo

Re: Нужна помощь в написании скрипта.

Сообщение ZyX »

/dev/random писал(а):
29.04.2012 22:49
ZyX писал(а):
29.04.2012 18:08
… и сделает таки изменённые глобальные переменные недоступными для дальнейшего использования.

Разумеется. Но вы же писали:
ZyX писал(а):
28.04.2012 23:53
Я изредка могу и сложный скрипт в одну строку написать.

А в пределах этой "одной строчки" всё будет доступно.

Кроме того, обратите внимание: введите в zsh команду sleep 100 | read foo и попробуйте "заморозить" её через ^Z. Вы получите сообщение: zsh: job can't be suspended. Так вот, это не просто случайный баг. Это следствие вышеописанного поведения zsh. Принципиально несовместимые фичи: либо управление задачами, либо получение переменных из пайпа. Разработчики zsh предпочли в таких случаях отключать управление задачами. Да, в bash тоже есть случаи, когда оно отключается, но их гораздо меньше. И знаете, я предпочитаю, чтобы оно работало как можно в большем числе случаев. Меня и в баше-то случаи его отключения раздражают, а с вашим zsh я бы повесился.
Как я понял, это относится только к shell коду, sleep 100 | less ставится на паузу нормально. Никогда не встречал с необходимостью сделать паузу для него, но интересно, про какие случаи вы говорите? Я не говорю, что их нет, но я их не встречал даже в zsh (за исключением разницы между интерактивной и неинтерактивной оболочками, и то в этом случае ничего полностью не отключается, просто нельзя использовать jobs, особенно jobs | smth).
Спасибо сказали: