bash: esegue il comando dato nella riga di comando e non uscire


13

come posso specificare un comando sulla linea di comando di bash che deve essere eseguito una volta all'interno della nuova bash dopo aver letto ~ / .bashrc - Ma tutto questo senza lasciare che bash esca al termine del comando?

Sto armeggiando con una "configurazione di avvio" per terminator in cui alcune divisioni dovrebbero avviare alcune applicazioni (vim, mutt, irrsi) dopo l'avvio. Ma voglio ancora normali shell in background (ctrl-z e così via ...) quindi dopo aver chiuso un'applicazione ho la stessa shell che avevo durante la vita delle applicazioni ...

Cosa non funziona per me (basato su risposte fornite)

 ( bash; vim )              # vim waits for the exit of bash...
 bash -c vim                # bash exits after vims exit...
 bash -c 'vim; exec bash'   # bash is executed _after_ vim... ctrl-z won't work
 echo vim | bash -s         # "Vim: Warning: Input is not from a terminal"     

Anche l'aggiunta manuale di "vim" a un bashrc temporaneo non funziona. vim si avvia correttamente, ma non è ancora presente uno sfondo bash in cui un ctrl-z mi porterebbe.

Eventuali suggerimenti?

Risposte:


4

Mi sembra di aver trovato il modo di risolverlo in modo che il controllo del lavoro funzioni:

bash --rcfile <(cat $ {HOME} /. bashrc; echo 'export PROMPT_COMMAND = "vim; export PROMPT_COMMAND ="') -i

Ciò crea il file bashrc personalizzato al volo e utilizza la variabile PROMPT_COMMAND per ritardare l'avvio di Vim in modo che il controllo del lavoro funzioni. Questo ovviamente può essere generalizzato per non essere specifico di Vim.

Ok, ho appena provato questo con terminator e almeno sembra funzionare con il file di configurazione:

[profiles]
[[default]]
    use_custom_command = True
    custom_command = "bash --rcfile <(cat ${HOME}/.bashrc; echo 'export PROMPT_COMMAND="vim; export PROMPT_COMMAND="') -i"

Molte grazie. Preferisco unset PROMPT_COMMANDpiuttosto che export PROMPT_COMMAND=, comunque.
Peque,

2
bash -c 'vim; exec bash'

La exec bashsostituirà l'istanza Bash corrente con uno nuovo.


1
hm yeah ... questo risolve il problema "divisione vuota dopo l'uscita" ... ma ctrl-z continua a non funzionare - bash viene semplicemente eseguito nuovamente dopo l'uscita di Vims ... Ho bisogno di vim all'interno di bash
marvin2k

1
Ho usato questo modulo e ho appena notato che non eredita gli alias ecc. Quando si usa just exec bash. exec bash --loginaiuta ma, come notato, questo funziona bash all'interno di bash che non è proprio quello che vogliamo.
Altendky,

Soluzione reale. Non brutto. +1
Andrew,

2

(Ab) l'utilizzo .bashrcè l' unico modo utilizzabile. 1 La generazione non è necessaria, tuttavia: basta inserire i comandi in una variabile di ambiente e eval:

  • Metti quanto segue alla fine del tuo ~/.bashrc:

    [[ $startup_cmd ]] && {
        declare +x startup_cmd
        eval "$startup_cmd"
    }
  • Configura Terminator per avviare questo comando:

    env startup_cmd='vim' bash

1 Escludiamo quelli "usa C4 per rompere un dado".


sembra carino e funziona a prima vista ... devo modificare bashrc, potrebbe vivere con quello ... ma per qualsiasi motivo, ctrl-z continua a non funzionare - qualche idea? - in quale tipo di armadio troverei la soluzione basata su c4?
marvin2k,

0

Ho avuto lo stesso problema nel contesto di voler generare vim in una finestra di tmux con la possibilità di uscire da ctrl-z. Alla fine, non sono riuscito a capire come farlo in modo pulito all'interno di Bash. Ho optato per quanto segue:

tmux new-session -d -s foo
tmux send-keys -t foo:0.0 "vim
"

0
bash --rcfile <(cat ${HOME}/.bashrc; echo 'trap vim 12'; echo 'echo $$>/tmp/foo'; echo '( sleep 1;kill -12 `</tmp/foo`; )' ) -i

Grazie all'utente wor per il " file bashrc personalizzato al volo "!

L'altra parte cruciale è la " trappola ", una build-bash:

  • Il comando trap sopra definisce vim da eseguire se bash riceve il segnale 12.
  • Messo in background durante l'esecuzione di rcfile, un comando kill -12 in agguato attende un secondo in modo che bash possa terminare l'inizializzazione. Se lo ometti, un Ctrl-Z durante vim non ti metterebbe in una shell funzionante .
  • Quindi l'uccisione viene eseguita e quindi viene avviato vim.
  • kill legge l'id del processo da / tmp / foo. Probabilmente esiste un modo più elegante.
  • Ho anche testato Ctrl-Z e funziona come previsto.

A proposito, non ho idea di quale sia il "terminatore" che lei menziona.

Ho trovato questo mentre cercavo una soluzione con bash e schermo.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.