Как запустить bash и сразу ввести в него команду?


2

Я хочу, чтобы bash сначала выполнил команду, но после ее завершения (или Ctrl+ C'ed) перейдите в интерактивный режим (предпочтительно с командой в истории, доступной для up).

Как добиться этого самым простым и красивым способом?

Вдохновленный cmd.exe's /K:

$ wineconsole cmd.exe /K echo qqq
qqq

Z:\home\wine>

Ответы:


3

Более чистая версия ответа Скотта :

  1. Поместите это в .bash_profile:

    if [ ! -z "$EXECUTE_COMMAND" ]; then
        history -s "$EXECUTE_COMMAND"
        $EXECUTE_COMMAND
    fi
  2. Начните bash так:

    $ EXECUTE_COMMAND='ping 127.0.0.1' bash -l
    PING 127.0.0.1 (127.0.0.1) 56(84) bytes of data.
    64 bytes from 127.0.0.1: icmp_req=1 ttl=64 time=0.177 ms
    ...
    ^C
    5 packets transmitted, 5 received, 0% packet loss, time 3996ms
    $
    $ ping 127.0.0.1

Хорошая уборка. Я рад видеть, что это history –sработает .bash_profile.
Скотт

2

Я не уверен на 100%, что я точно понимаю, о чем вы просите, и (увы) на данный момент у меня нет доступа к системе, bashна которой она установлена, но, возможно, вам поможет следующее. Поместите это в конце вашего .bashrc:

if [-f ~ / .bash_initial_command]
тогда
    , ~ / .Bash_initial_command
    rm ~ / .bash_initial_command
фи

(где .bash_initial_commandпроизвольное имя файла; выберите другое, если хотите), а затем напишите скрипт, который делает это:

(echo "history –s '$ @'"; echo "$ @")> ~ / .bash_initial_command

То есть, это помещает команду (которая представлена ​​вышеупомянутому сценарию как аргумент (ы)) в место, где следующий интерактивный bashзапуск найдет и выполнит ее. (Например, если вы запустите set_up_cmd ls –l, ваш следующий bashзапустится ls –l.)  history –sПомещает команду в историю, не выполняя ее.
Примечание: я не знаю, будет ли это работать с .bashrc.

Это потребует большего уточнения, если вы захотите использовать команды с кавычками (то есть, специальными символами в кавычках) или перенаправлением ( <или >); или составные команды (то есть, содержащий ;, |, &&, или ||).

Небольшая проблема: если вы Ctrl+ Cкоманда, это, вероятно, прекратит .bashrcобработку и тем самым предотвратит .bash_initial_commandудаление файла. Вы, вероятно, можете справиться с этим, делая

if [-f ~ / .bash_initial_command]
тогда
    mv ~ / .bash_initial_command ~ / .bash_initial_command. $$
    trap "rm -f ~ / .bash_initial_command. $$" 0
    , ~ / .Bash_initial_command $$.
    rm -f ~ / .bash_initial_command. $$
фи

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

Если вам нужно , чтобы иметь возможность запустить несколько из них одновременно, рассмотрит построение названия «терминального» $(basename $(tty))в имени .bash_initial_commandфайла.

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


Немного странно ...
Ви.

@Vi .: Ты тоже не хочешь знать, как делают колбасу. Но делает ли это то, что вы хотите?
Скотт

Теперь посмотрим, как сделать его более-менее простым скриптом без взлома .bash_profile.
Ви.

Выполнено (без `tty` или .bash_initial_command, хотя все еще с .bash_profile)
Vi.

0

Вы можете добавить команду в свой .bash_profileили .bashrc. Он запустится, как только вы откроете новое окно или войдете в систему.

Смотрите эту страницу о различиях между двумя файлами.


Или вы имеете в виду, что хотите запустить новый процесс bash из командной строки, которая уже запущена, передать команду в качестве параметра, а затем остаться в этом процессе bash после завершения команды?
Стивен Шраугер

Да. На самом деле я хочу запустить gnome-терминал с несколькими предварительно открытыми вкладками, но там, где я могу легко нажать клавиши Ctrl + C и перезапустить (вероятно, с добавленными параметрами).
Ви.
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.