bash: komut satırında verilen komutu yürütün ve çıkmayın


13

~ / .bashrc - okuduktan sonra yeni bash içinde bir kez yürütülecek olan bash iletişim hattında bir komutu nasıl belirtebilirim?

Bazı böler başlatmadan sonra bazı uygulamaları (vim, mutt, irrsi) başlatması gereken sonlandırıcı için bir "önyükleme-yapılandırma" ile uğraşıyorum. Ama yine de arka planda normal kabuklar istiyorum (ctrl-z vb ...) Bu yüzden bir uygulamadan çıktıktan sonra, eapplications ömrü boyunca sahip olduğum kabuğun aynısına sahibim ...

Benim için ne işe yaramaz (verilen cevaplara göre)

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

El ile "vim" geçici bir bashrc eklemek de çalışmaz. vim doğru bir şekilde başlar, ancak hala bir ctrl-z'nin beni getireceği arka plan bashı yoktur.

Herhangi bir öneri?

Yanıtlar:


4

İş kontrolünün çalışması için bunu çözmenin bir yolunu buldum:

bash --rcfile <(cat $ {HOME} /. bashrc; echo 'dışa aktarma PROMPT_COMMAND = "vim; dışa aktarma PROMPT_COMMAND ="') -i

Bu, anında özel bashrc dosyası oluşturur ve iş denetiminin çalışması için Vim başlatmayı geciktirmek için PROMPT_COMMAND değişkenini kullanır. Bu elbette Vim'e özgü olmayacak şekilde genelleştirilebilir.

Tamam, sadece sonlandırıcı ile test edildi ve en azından config dosyası ile çalışıyor gibi görünüyor:

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

Çok teşekkürler. Tercihim unset PROMPT_COMMANDyerine export PROMPT_COMMAND=olsa.
Peque

2
bash -c 'vim; exec bash'

exec bashYenisi ile cari Bash örneğini yerini alacaktır.


1
hm evet ... bu "çıkış sonrası boş bölünme" sorununu çözüyor ... ama ctrl-z hala çalışmıyor - bash vims çıktıktan sonra tekrar yürütülür ... bash içinde vim gerekir
marvin2k

1
Bu formu kullanıyorum ve sadece kullanırken takma adları vb miras olmadığını fark ettim exec bash. exec bash --loginyardımcı olur ama belirtildiği gibi bu gerçekten ne istediğini değil bash içinde bash çalışır.
altendky

Gerçek çözüm. Çirkin değil. +1
Andrew

2

(Ab) kullanılarak .bashrcbir tek kullanılabilir şekilde. 1 Nesil gerekli değildir, ancak komutları bir ortam değişkenine evalkoyun ve aşağıdakileri yapın :

  • Aşağıdakileri sonuna ekleyin ~/.bashrc:

    [[ $startup_cmd ]] && {
        declare +x startup_cmd
        eval "$startup_cmd"
    }
  • Terminator'ü bu komutu başlatacak şekilde yapılandırın:

    env startup_cmd='vim' bash

1 "Bir somunu kırmak için C4 kullanın" olanlarını hariç tutalım.


güzel görünüyor ve ilk bakışta çalışıyor ... bashrc değiştirmek zorunda, hayat onunla olabilir ... ama hangi nedenle olursa olsun, ctrl-z hala çalışmıyor - herhangi bir fikir? - c4 tabanlı çözümü ne tür bir dolapta bulabilirim?
marvin2k

0

Aynı problemi ctrl-z yeteneği olan bir tmux penceresinde vim doğurmak istemek bağlamında da yaşadım. Sonunda, bash içinde nasıl temiz bir şekilde yapılacağını anlayamadım. Aşağıdakilere karar verdim:

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

" Anında özel bashrc dosyası " için kullanıcı wor teşekkürler !

Diğer önemli kısım ise bir bash yerleşimi olan " trap ":

  • Yukarıdaki bindirme komutu, eğer bash sinyal 12 alırsa, yürütülecek vimi tanımlar.
  • Rcfile yürütme sırasında arka plana koymak, gizlenen kill -12 komutu bash başlatmayı bitirmek için bir saniye bekler. Bunu atlarsanız, vim sırasında bir Ctrl-Z sizi çalışan bir kabuğa sokmaz.
  • Sonra öldürme yapılır ve böylece vim başlatılır.
  • kill, / tmp / foo'dan işlem kimliğini okur. Muhtemelen daha zarif bir yol var.
  • Ayrıca Ctrl-Z'yi de test ettim ve beklendiği gibi çalışıyor.

Bu arada bahsettiğiniz "sonlandırıcının" ne olduğu hakkında hiçbir fikrim yok.

Bunu bash ve screen ile bir çözüm ararken buldum.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.