bash: commande exécutée en ligne de commande et ne quitte pas


13

comment spécifier une commande sur la ligne de commande de bash qui doit être exécutée une fois dans la nouvelle bash après avoir lu ~ / .bashrc - Mais tout cela sans laisser bash quitter après la fin de la commande?

Je bricole avec une "configuration de démarrage" pour terminateur où certaines divisions devraient démarrer certaines applications (vim, mutt, irrsi) après le démarrage. Mais je veux toujours des coquilles normales en arrière-plan (ctrl-z et ainsi de suite ...) donc après avoir quitté une application, j'ai la même coquille que celle que j'avais pendant la durée de vie des applications ...

Ce qui ne fonctionne pas pour moi (basé sur les réponses données)

 ( 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"     

Ajouter manuellement "vim" à une base temporaire ne fonctionne pas non plus. vim démarre correctement, mais il n'y a toujours pas d'arrière-plan dans lequel un ctrl-z m'amènerait.

Aucune suggestion?

Réponses:


4

Il me semble avoir trouvé un moyen de résoudre ce problème afin que le contrôle des tâches fonctionne:

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

Cela crée un fichier bashrc personnalisé à la volée et utilise la variable PROMPT_COMMAND pour retarder le démarrage de Vim afin que le contrôle du travail fonctionne. Ceci peut bien sûr être généralisé pour ne pas être spécifique à Vim.

Ok, je viens de tester cela avec le terminateur et semble au moins fonctionner avec le fichier de configuration:

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

Merci beaucoup. Je préfère unset PROMPT_COMMANDplutôt que export PROMPT_COMMAND=, cependant.
Peque

2
bash -c 'vim; exec bash'

Le exec bashremplacera l'instance Bash actuelle par une nouvelle.


1
hm yeah ... cela résout le problème de "division vide après sortie" ... mais ctrl-z ne fonctionne toujours pas - bash est simplement exécuté à nouveau après la sortie de vims ... J'ai besoin de vim inside bash
marvin2k

1
Je suis en utilisant ce formulaire et juste remarqué qu'il ne hérite pas alias etc lors de l' utilisation juste exec bash. exec bash --loginaide mais comme noté, cela fonctionne bash à l'intérieur de bash qui n'est pas vraiment ce que nous voulons.
mardi

Solution actuelle. Pas moche. +1
Andrew

2

(Ab) utiliser .bashrcest le seul moyen utilisable. 1 La génération est inutile, cependant - il suffit de placer la (les) commande (s) dans une variable d’environnement et evalcelle - ci:

  • Mettez ce qui suit à la fin de votre ~/.bashrc:

    [[ $startup_cmd ]] && {
        declare +x startup_cmd
        eval "$startup_cmd"
    }
  • Configurez Terminator pour démarrer cette commande:

    env startup_cmd='vim' bash

1 Excluons les "utiliser C4 pour casser une noix".


semble sympa et fonctionne au premier coup d'œil ... je dois modifier bashrc, la vie pourrait-elle rester avec cela ... mais pour une raison quelconque, ctrl-z ne fonctionne toujours pas - vous avez une idée? - Dans quel type d'armoire pourrais-je trouver la solution basée sur c4?
Marvin2k

0

J'ai eu ce même problème dans le contexte de vouloir générer vim dans une fenêtre tmux avec la possibilité de ctrl-z out. En fin de compte, je n'ai pas réussi à comprendre comment le faire proprement à l'intérieur de bash. Je me suis installé sur ce qui suit:

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

Merci à l'utilisateur wor pour le " fichier bashrc personnalisé à la volée "!

L'autre partie cruciale est " piège ", une bash-intégrée:

  • La commande trap ci-dessus définit simplement vim à exécuter si bash reçoit le signal 12.
  • Mis en arrière-plan pendant l'exécution du fichier rc, une commande cachée kill -12 attend une seconde afin que bash puisse terminer son initialisation. Si vous omettez cela, un Ctrl-Z pendant vim ne vous mettrait pas dans un shell en état de fonctionnement .
  • Alors kill est exécuté et donc vim est démarré.
  • kill lit l'identifiant du processus dans / tmp / foo. Il y a probablement une manière plus élégante.
  • J'ai aussi testé Ctrl-Z et cela fonctionne comme prévu.

Je n'ai aucune idée de ce que le "terminateur" que vous avez mentionné est d'ailleurs.

J'ai trouvé cela en cherchant une solution avec bash et screen.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.