2

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

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

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

$ wineconsole cmd.exe /K echo qqq
qqq

Z:\home\wine>

3 ответа3

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
    
2

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

if [ -f ~/.bash_initial_command ]
then
    . ~/.bash_initial_command
    rm ~/.bash_initial_command
fi

(где .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 ]
then
    mv ~/.bash_initial_command ~/.bash_initial_command.$$
    trap "rm -f ~/.bash_initial_command.$$" 0
    . ~/.bash_initial_command.$$
    rm -f ~/.bash_initial_command.$$
fi

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

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

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

0

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

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .