А бывает такой shell или костыль к нему?
К примеру, я запустил что-то, что долго выполняется:Это можно в консоли написать:
$ longruncommand
А с утра вспомнил, что после того, как она закончится, я хочу запустить ещё что-нибудь, чтобы стало так:
$ longruncommand && additionalcommand
И я хочу это сделать само собой не прерывая выполнения longruncommand.
$? && additionalcommand
Или наоборот, я запустил полную цепочку, но вдруг передумал и решил, что не хочу после longruncommand запускать additionalcommandэто сложнее, они же все сразу запускаются — если грохнуть, пайпы сломаются
цепочка может быть не через пайпы, а просто через ; или &&
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 ~ $
работает.
Спасибо за ценную информацию, я раньше предполагал, что весь ввод, который я делаю во время выполнения команды, идёт только в неё. Оказывается, если она не читает стандартный ввод, то он идёт на выполнение после ещё завершения. Однако ж если программа читает стандартный ввод, то это, очевидно, не прокатит.
это сложнее, они же все сразу запускаются — если грохнуть, пайпы сломаютсяВ данном случае, две команды, соединённые пайпом, должны считаться за одну. Редактировать должно быть можно только то, что ещё не запустилось.
И вообще, я про пайпы не упоминал в первом посте...
Спасибо за ценную информацию, я раньше предполагал, что весь ввод, который я делаю во время выполнения команды, идёт только в неё.фига ты терпеливый!
присодиняюсь к хотелке: а ещё хочется чтобы так с пайпами тоже работало
например запустил какое-нить добро, а потом захотелось у него весь вывод засунуть в файлики и прикрыть ssh (запустить заранее скрин ума не хватило)
я где-то видел с помощью gdb такую штуку, но оно глючило
тогда можно попробовать очереди задач (task-spooler), это немного не то же самое, что и команда шелла, но там можно добавлять зависимости и дропать неугодные задачи.
присодиняюсь к хотелкеЧтобы это стало хотелкой, это должно быть в багтрекере какого-нибудь шелла, а не на форумлокал. Пока это исследование того, что имеется на данный момент.
а ещё хочется чтобы так с пайпами тоже работалоНу по идее приписать "> output" в любой момент времени ничего не должно мешать. Просто в файле окажется только то, что после этой добавки вывелось. Приписать пайп "| additionalcommand" тоже по такой схеме по идее можно, но убрать это уже нельзя будет, так как применяется это сразу по старту команды.
например запустил какое-нить добро, а потом захотелось у него весь вывод засунуть в файлики и прикрыть ssh (запустить заранее скрин ума не хватило)
я где-то видел с помощью gdb такую штуку, но оно глючилоТребуются подробности! Хрен с ними, с костылями - главное функционал!
http://vicerveza.homeunix.net/~viric/soft/ts/
Прочитал описание и обзор. Программа годная, иногда может пригодиться, но всё же не совсем то:
1) Надо не забывать кидать долгоиграющие задачи в неё. Естесственно, если речь о том, что я вспомнил внезапно, то вряд ли стоит на это расчитывать. Да и хочется пользоваться этим не только с сильно долгими задачами, но и всегда вообще.
2) Очередь не привязана к терминалу. По-моему было бы удобнее, если бы была. Хотя бы потому, что я хочу сразу видеть вывод программы без дополнительных телодвижений и вообще-то иногда с программой нужно взаимодействовать, а она, судя по всему, в случае ts открепляется от терминала.
Ну по идее приписать "> 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:~$
Требуются подробности! Хрен с ними, с костылями - главное функционал!
я правда не помню как
видел рецепт, он работал но не всегда
Не совсем как надо работает, я бы сказал.Ну главное, что ты меня понял.
А вот так:
я раньше предполагал, что весь ввод, который я делаю во время выполнения команды, идёт только в неё. Оказывается, если она не читает стандартный ввод, то он идёт на выполнение после ещё завершения. Однако ж если программа читает стандартный ввод, то это, очевидно, не прокатит.Если она читает стандартный ввод, то она без твоего присутствия работать не будет скорее всего.
Кстати, по 2-му вопросу можно делать как-нибудь так:
./cmd1.sh && ./cmd2.sh
И если ты передумаешь, то можно поменять содержимое cmd2.sh до того, как оно запустилось. Но это надо заранее предвидеть.
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.
Ещё есть команда "wait" — можно дождаться завершения процесса, узнать код возврата.
обычно мне достаточно Ctrl-Z (текущая задача приостановится), потом bg (задача продолжит выполнение и уйдёт в фон) и wait && command_2
не прокатило:Конечно, не прокатило. Ты понимаешь что значит "по идее"?
Если она читает стандартный ввод, то она без твоего присутствия работать не будет скорее всего.В общем случае - не обязательно. Но чаще всего, пожалуй, ты прав.
Но это надо заранее предвидеть.В том-то и фигня, что каждый раз так делать не будешь, а когда понадобится - заранее не предвидешь.
ясно, значит с ts надо будет поиграться на досуге. Может с ней и получится достигнуть тто-то типа того, что я хочу.
обычно мне достаточно Ctrl-Z (текущая задача приостановится), потом bg (задача продолжит выполнение и уйдёт в фон) и wait && command_2А в чём преимущество по сравнению с написанием следующей команды сразу за предыдущей с проверкой статуса, если надо, через $?
вероятно я плохо понял изначальный пост
if (($? == 0)); then additionalcommand; fi
которое первым же ответом предложил ?
если у меня в консоли что-то запущено, я ничего не могу дописать - потому что там что-то выполняется... чтобы получить доступ к этой консоли, я должен детачнуть задачу...
обычно мне достаточно Ctrl-Z (текущая задача приостановится), потом bg (задача продолжит выполнение и уйдёт в фон) и wait && command_2Если ничего не путаю, то после Ctrl+Z работает и так: fg && command_2
вероятно я сам что-то не понимаю в этом решенииЕсли команда запущенная не читает stdin, то всё, что ты натыкаешь в консоль по факту попадёт из буфера ввода после завершения команды на вход шелу и он это выполнит. С wait, наверное, более "правильно". Но в качестве грубого и быстрого решения и так сойдёт.
если у меня в консоли что-то запущено, я ничего не могу дописать - потому что там что-то выполняется... чтобы получить доступ к этой консоли, я должен детачнуть задачу...
Оставить комментарий
dangerr
Увидел тему Айвенго про bash vs zsh и вспомнил, что давно хотел спросить.Есть ли такой шелл или костыль к нему, который бы позволял редактировать уже запущенные цепочки команд?
К примеру, я запустил что-то, что долго выполняется:
$ longruncommand
А с утра вспомнил, что после того, как она закончится, я хочу запустить ещё что-нибудь, чтобы стало так:
$ longruncommand && additionalcommand
И я хочу это сделать само собой не прерывая выполнения longruncommand.
Или наоборот, я запустил полную цепочку, но вдруг передумал и решил, что не хочу после longruncommand запускать additionalcommand. А пока longcommand выполняется, я хочу иметь возможность отменить выполнение additionalcommand, не затрагивая longruncommand.