А бывает такой shell или костыль к нему?

dangerr

Увидел тему Айвенго про bash vs zsh и вспомнил, что давно хотел спросить.
Есть ли такой шелл или костыль к нему, который бы позволял редактировать уже запущенные цепочки команд?
К примеру, я запустил что-то, что долго выполняется:
$ longruncommand
А с утра вспомнил, что после того, как она закончится, я хочу запустить ещё что-нибудь, чтобы стало так:
$ longruncommand && additionalcommand
И я хочу это сделать само собой не прерывая выполнения longruncommand.
Или наоборот, я запустил полную цепочку, но вдруг передумал и решил, что не хочу после longruncommand запускать additionalcommand. А пока longcommand выполняется, я хочу иметь возможность отменить выполнение additionalcommand, не затрагивая longruncommand.

tokuchu

К примеру, я запустил что-то, что долго выполняется:
$ longruncommand
А с утра вспомнил, что после того, как она закончится, я хочу запустить ещё что-нибудь, чтобы стало так:
$ longruncommand && additionalcommand
И я хочу это сделать само собой не прерывая выполнения longruncommand.
Это можно в консоли написать:
$? && additionalcommand

:)

okis

Или наоборот, я запустил полную цепочку, но вдруг передумал и решил, что не хочу после longruncommand запускать additionalcommand
это сложнее, они же все сразу запускаются — если грохнуть, пайпы сломаются

YUAL

цепочка может быть не через пайпы, а просто через ; или &&

dangerr


tot-double ~ $ sleep 10
$? && echo test
tot-double ~ $ $? && echo test
bash: 0: command not found
tot-double ~ $

Не совсем как надо работает, я бы сказал.
А вот так:

tot-double ~ $ sleep 5; false
if (($? == 0)); then echo test; fi
tot-double ~ $ if (($? == 0)); then echo test; fi
tot-double ~ $ sleep 5
if (($? == 0)); then echo test; fi
tot-double ~ $ if (($? == 0)); then echo test; fi
test
tot-double ~ $

работает.
Спасибо за ценную информацию, я раньше предполагал, что весь ввод, который я делаю во время выполнения команды, идёт только в неё. Оказывается, если она не читает стандартный ввод, то он идёт на выполнение после ещё завершения. Однако ж если программа читает стандартный ввод, то это, очевидно, не прокатит.

dangerr

это сложнее, они же все сразу запускаются — если грохнуть, пайпы сломаются
В данном случае, две команды, соединённые пайпом, должны считаться за одну. Редактировать должно быть можно только то, что ещё не запустилось.
И вообще, я про пайпы не упоминал в первом посте...

hwh2010

Спасибо за ценную информацию, я раньше предполагал, что весь ввод, который я делаю во время выполнения команды, идёт только в неё.
фига ты терпеливый!
присодиняюсь к хотелке: а ещё хочется чтобы так с пайпами тоже работало
например запустил какое-нить добро, а потом захотелось у него весь вывод засунуть в файлики и прикрыть ssh (запустить заранее скрин ума не хватило)
я где-то видел с помощью gdb такую штуку, но оно глючило

okis

тогда можно попробовать очереди задач (task-spooler), это немного не то же самое, что и команда шелла, но там можно добавлять зависимости и дропать неугодные задачи.

dangerr

присодиняюсь к хотелке
Чтобы это стало хотелкой, это должно быть в багтрекере какого-нибудь шелла, а не на форумлокал. :) Пока это исследование того, что имеется на данный момент.
а ещё хочется чтобы так с пайпами тоже работало
например запустил какое-нить добро, а потом захотелось у него весь вывод засунуть в файлики и прикрыть ssh (запустить заранее скрин ума не хватило)
Ну по идее приписать "> output" в любой момент времени ничего не должно мешать. Просто в файле окажется только то, что после этой добавки вывелось. Приписать пайп "| additionalcommand" тоже по такой схеме по идее можно, но убрать это уже нельзя будет, так как применяется это сразу по старту команды.
я где-то видел с помощью gdb такую штуку, но оно глючило
Требуются подробности! Хрен с ними, с костылями - главное функционал!

dangerr

Ты про это, да?
http://vicerveza.homeunix.net/~viric/soft/ts/
Прочитал описание и обзор. Программа годная, иногда может пригодиться, но всё же не совсем то:
1) Надо не забывать кидать долгоиграющие задачи в неё. Естесственно, если речь о том, что я вспомнил внезапно, то вряд ли стоит на это расчитывать. Да и хочется пользоваться этим не только с сильно долгими задачами, но и всегда вообще.
2) Очередь не привязана к терминалу. По-моему было бы удобнее, если бы была. Хотя бы потому, что я хочу сразу видеть вывод программы без дополнительных телодвижений и вообще-то иногда с программой нужно взаимодействовать, а она, судя по всему, в случае ts открепляется от терминала.

hwh2010

Ну по идее приписать "> output" в любой момент времени ничего не должно мешать.
не прокатило:

laptop:~$ ls out1
ls: невозможно получить доступ к out1: Нет такого файла или каталога
laptop:~$ (echo 1; sleep 5; echo 2; sleep 5; echo 3)
1
> out1
2
3
laptop:~$ > out1
laptop:~$ ls out1
out1
laptop:~$ cat out1
laptop:~$

Требуются подробности! Хрен с ними, с костылями - главное функционал!

я правда не помню как
видел рецепт, он работал но не всегда

tokuchu

Не совсем как надо работает, я бы сказал.
А вот так:
Ну главное, что ты меня понял. :)
я раньше предполагал, что весь ввод, который я делаю во время выполнения команды, идёт только в неё. Оказывается, если она не читает стандартный ввод, то он идёт на выполнение после ещё завершения. Однако ж если программа читает стандартный ввод, то это, очевидно, не прокатит.
Если она читает стандартный ввод, то она без твоего присутствия работать не будет скорее всего. :)
Кстати, по 2-му вопросу можно делать как-нибудь так:
./cmd1.sh && ./cmd2.sh
И если ты передумаешь, то можно поменять содержимое cmd2.sh до того, как оно запустилось. Но это надо заранее предвидеть.

tokuchu

2) Очередь не привязана к терминалу. По-моему было бы удобнее, если бы была. Хотя бы потому, что я хочу сразу видеть вывод программы без дополнительных телодвижений и вообще-то иногда с программой нужно взаимодействовать, а она, судя по всему, в случае ts открепляется от терминала.
Там есть опция такая:
-f Don not put the task into background. Wait the queue and the
command run without getting detached of the terminal. The exit
code will be that of the command, and if used together with -n,
no result will be stored in the queue.
Возможно даже полноценно терминал сможет использовать, я не пробовал.

tokuchu

Ещё есть команда "wait" — можно дождаться завершения процесса, узнать код возврата.

margadon

обычно мне достаточно Ctrl-Z (текущая задача приостановится), потом bg (задача продолжит выполнение и уйдёт в фон) и wait && command_2

dangerr

не прокатило:
Конечно, не прокатило. Ты понимаешь что значит "по идее"?

dangerr

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

dangerr

ясно, значит с ts надо будет поиграться на досуге. Может с ней и получится достигнуть тто-то типа того, что я хочу.

dangerr

обычно мне достаточно Ctrl-Z (текущая задача приостановится), потом bg (задача продолжит выполнение и уйдёт в фон) и wait && command_2
А в чём преимущество по сравнению с написанием следующей команды сразу за предыдущей с проверкой статуса, если надо, через $?

margadon

представь, вот запустил я сортироваться десятигиговый файл, нажал enter... и через три часа понял, что эта команда закончится аж ночью, потому надо бы с результатом сразу сделать ещё что-то интересное. дописывать к уже запущенной команде что-то ещё - поздно...
вероятно я плохо понял изначальный пост

dangerr

Про это я, как бы и спрашивал изначально. Я просто не понимаю чем твоё решение лучше/отличается, от решения с дописыванием сразу после выполняемой команды:
if (($? == 0)); then additionalcommand; fi
которое первым же ответом предложил ?

margadon

вероятно я сам что-то не понимаю в этом решении
если у меня в консоли что-то запущено, я ничего не могу дописать - потому что там что-то выполняется... чтобы получить доступ к этой консоли, я должен детачнуть задачу...

Filan

обычно мне достаточно Ctrl-Z (текущая задача приостановится), потом bg (задача продолжит выполнение и уйдёт в фон) и wait && command_2
Если ничего не путаю, то после Ctrl+Z работает и так: fg && command_2

tokuchu

вероятно я сам что-то не понимаю в этом решении
если у меня в консоли что-то запущено, я ничего не могу дописать - потому что там что-то выполняется... чтобы получить доступ к этой консоли, я должен детачнуть задачу...
Если команда запущенная не читает stdin, то всё, что ты натыкаешь в консоль по факту попадёт из буфера ввода после завершения команды на вход шелу и он это выполнит. С wait, наверное, более "правильно". Но в качестве грубого и быстрого решения и так сойдёт.
Оставить комментарий
Имя или ник:
Комментарий: