Como iniciar o bash e imediatamente “digitar” o comando nele?

2

Eu quero que o bash primeiro execute um comando, mas depois que o comando terminar (ou Ctrl + C 'ed) entrar no modo interativo (de preferência com o comando no histórico , disponível para up ).

Como alcançá-lo da maneira mais fácil e mais bonita?

Inspirado em /K :

do cmd.exe
$ wineconsole cmd.exe /K echo qqq
qqq

Z:\home\wine>
    
por Vi. 04.02.2013 / 22:42

3 respostas

3

Versão mais limpa da resposta de Scott :

  1. Coloque isso em .bash_profile :

    if [ ! -z "$EXECUTE_COMMAND" ]; then
        history -s "$EXECUTE_COMMAND"
        $EXECUTE_COMMAND
    fi
    
  2. Comece a bater dessa maneira:

    $ 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
    
por 05.02.2013 / 22:42
2

Não tenho 100% de certeza de que entendi exatamente o que você está pedindo, e (infelizmente) não tenho acesso a um sistema com bash no momento, mas talvez o seguinte ajude você. Coloque isso no final do seu .bashrc :

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

(onde .bash_initial_command é um nome de arquivo arbitrário; escolha um diferente se quiser) e, em seguida, escreva um script que faça isso:

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

Ou seja, isso coloca o comando (que é apresentado ao script acima como argumento (s)) em um local onde o próximo bash interativo para iniciar o encontrará e o executará. (Por exemplo, se você executar set_up_cmd ls –l , seu próximo bash executará ls –l .) history –s colocará um comando no histórico sem executá-lo.
Observação: Eu não sei se isso funcionará em .bashrc .

Isso precisará de mais refinamento se você quiser usar comandos com aspas (isto é, caracteres especiais citados) ou redirecionamento ( < ou > ); ou comandos compostos (ou seja, contendo ; , | , && ou || ).

Um problema menor: se você Ctrl + C o comando, isso provavelmente terminará o processamento .bashrc e assim evitará que o arquivo .bash_initial_command seja apagado. Você provavelmente pode lidar com isso fazendo

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

Isso dá a .bash_initial_command um nome único, para evitar colisões, e faz com que ele seja excluído quando o shell sair.

Se você precisar ativar vários deles simultaneamente, considere a criação do nome "tty" $(basename $(tty)) no nome do arquivo .bash_initial_command .

Claro, isso torna ainda mais importante ter certeza de que seu diretório pessoal não pode ser escrito por ninguém além de você mesmo.

    
por 05.02.2013 / 21:22
0

Você pode adicionar o comando ao seu .bash_profile ou .bashrc . Ele será executado assim que você abrir uma nova janela ou fizer login na sua máquina.

Veja esta página sobre as diferenças entre os dois arquivos.

    
por 04.02.2013 / 22:45