Откройте новую консоль из скрипта, выполнив команду и став по завершении интерактивной

3725
Hashbrown

Я хочу иметь возможность получить скрипт (запускается при запуске), чтобы открыть konsoleтерминал.
Когда он открывается, он должен сделать некоторые постоянные вещи (например, изменить каталог и исходный bashrc) и запустить долго работающую программу.
Если происходит сбой программы или я захожу, и <ctrl+c>она начинает принимать команды от стандартного ввода (например, «up-enter», чтобы повторить попытку, как если бы она была интерактивной все время).

Я перепробовал так много вещей, чтобы заставить его работать (в настоящее время я просто пытаюсь получить его lsи вернуться к интерактивному завершению);

konsole -e ls konsole --hold ls konsole -e /bin/bash -c ls konsole --hold -e "/bin/bash -c ls" konsole -e "/bin/bash -i -c ls" konsole -e /bin/bash -i -c ls konsole -e "echo ls > /tmp/konsolebash;/bin/bash -i --rcfile /tmp/konsolebash"  echo ls > /tmp/konsolebash konsole -e "/bin/bash -i --rcfile /tmp/konsolebash" 

Это связано с цитатами? Разве я не должен их использовать, должен ли я что-то избегать?
Я даже хотел попробовать и выполнить bash?
У меня заканчиваются идеи, но я надеюсь, что это даже достижимо (но, надеюсь, не что-то смущающее простое, что я пропустил).

Я опрошу ответы, которые успешно используют другие эмуляторы терминала, если, konsoleв частности, проблема (но так как вопрос конкретно о, konsoleя не думаю, что смогу дать вам сочные галочки)

2
Последние две строки выглядят многообещающими. Вы пробовали их, не избегая кавычек вокруг `source ... ls`? n.st 10 лет назад 0
извините, что была ошибка копирования и вставки при написании вопроса Hashbrown 10 лет назад 0
И это не сработало? Странно ... Что именно * это сделало? n.st 10 лет назад 0
да, он просто вызывает обычную интерактивную оболочку (видимая команда не запускается, отображается только подсказка). Кажется, что он либо принимает аргументы, либо интерактивен, но не то и другое одновременно. Hashbrown 10 лет назад 0
Если больше ничего не работает, вы можете использовать `konsole -e" bash -c 'ls'; bash "` - что действительно ужасно, но должно оставить вас с интерактивной оболочкой, когда `ls` завершится. n.st 10 лет назад 0
но это забудет любую `cd` и историю команд (break` up-enter`). Можно и не сделать его интерактивным и открыть две оболочки Hashbrown 10 лет назад 0
Поскольку мы уже делаем ужасные вещи: `ls; echo 'ls' >> $ HOME / .bash_history; bash` n.st 10 лет назад 0
Однако я все еще думаю, что использование `--rcfile` должно было сделать именно то, что вам нужно ... Редактировать: На самом деле, я только что проверил, и` bash --rcfile / tmp / foo` работает для меня, в то время как `bash` отказывается начать с `-i --rcfile / tmp / foo`. Поэтому попробуйте опустить `-i` и посмотреть, поможет ли это. n.st 10 лет назад 1
Извините, я упустил из виду, что команды в файле rcfile не добавляются в историю, поэтому `--rcfile` бесполезен для вашего приложения. Похоже, нам нужен взлом `echo 'ls' >> .bash_history` в конце концов ... n.st 10 лет назад 0
И вот еще одна идея, предложенная ZyX в комментарии к [этому ответу] (http://stackoverflow.com/a/6219428/1114687): вызвать сеанс `screen`, а затем запустить` ls` в новом созданная сессия. n.st 10 лет назад 0
спасибо за все это, я не знал, что это будет так сложно. Комментарий, за который я проголосовал, работал (но без истории). Даже если `cd` находится в файле. Вы должны дать ответ, чтобы я мог выразить его / чтобы другие могли его увидеть и получить от него помощь. Hashbrown 10 лет назад 0

1 ответ на вопрос

3
Hashbrown

Благодаря комментариям @ n.st я сделал этот вкладыш:

konsole -e /bin/bash --rcfile <(echo "cd /;ls;echo hi | less") 

Это просто более короткая версия без tmpfiles, использующая замену процесса bash для следующего;

echo "cd /;ls;echo hi | less" > /tmp/konsolebash;konsole -e /bin/bash --rcfile /tmp/konsolebash 

Который будет запускать некоторые команды, отображать их, изменять среду, запускать долго работающую программу ( less) и когда она закончится ( :q), будет интерактивной.
Поэтому замените cd /;ls;echo hi | less(демонстрацию) своим сценарием.

Нет истории, но, по крайней мере, вы сейчас находитесь в правильном каталоге и у вас есть переменные окружения, которые вы, возможно, захотите настроить.


В основном так же, как моя предыдущая попытка;

konsole -e "echo ls > /tmp/konsolebash;/bin/bash -i --rcfile /tmp/konsolebash" 

за исключением того, что запись в файл находится за пределами konsoleвыполнения, я сбросил -iфлаг и параметры выполнения не находятся в одном блоке кавычек


К сожалению, --rcfileпереключатель заставляет вас ~/.bashrcне загружаться для этих команд, поэтому, если вам нужен псевдоним или что-то еще, вам придется это сделать;

cat ~/.bashrc > /tmp/konsolebash; echo "commands" >> /tmp/konsolebash;konsole -e /bin/bash --rcfile /tmp/konsolebash 

Который просто копирует ваш bashrc, а затем добавляет ваши команды в конце

Нет необходимости копировать ваш bashrc, просто используйте `source ~ / .bashrc`. n.st 10 лет назад 0
Я действительно попробовал это, это не работает для остальных команд в списке. Т.е. если `.bashrc` имеет псевдоним` BOB`, аргумент `source ~ / .bashrc; BOB; cd /` будет иметь `BOB`. Я понятия не имею, почему, но это работает Hashbrown 10 лет назад 0