bash: jalankan perintah yang diberikan dalam commandline dan jangan keluar


13

bagaimana cara menentukan perintah pada perintah bash yang akan dieksekusi sekali di dalam bash baru setelah membaca ~ / .bashrc - Tapi semua ini tanpa membiarkan bash keluar setelah perintah selesai?

Saya mengutak-atik dengan "boot-up-konfigurasi" untuk terminator di mana beberapa splits harus memulai beberapa aplikasi (vim, mutt, irrsi) setelah startup. Tapi saya masih ingin kerang yang normal di latar belakang (ctrl-z dan sebagainya ...) jadi setelah berhenti dari aplikasi saya memiliki shell yang sama yang saya miliki selama masa penerapan ...

Apa yang tidak berhasil untuk saya (berdasarkan jawaban yang diberikan)

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

Menambahkan "vim" secara manual ke bashrc sementara juga tidak berfungsi. vim memulai dengan benar, tetapi masih tidak ada bash latar belakang di mana ctrl-z akan membawa saya ke.

Ada saran?

Jawaban:


4

Sepertinya saya telah menemukan cara untuk menyelesaikan ini sehingga kontrol pekerjaan berfungsi:

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

Ini membuat file bashrc khusus dengan cepat dan menggunakan variabel PROMPT_COMMAND untuk menunda mulai Vim sehingga kontrol pekerjaan harus berfungsi. Ini tentu saja dapat digeneralisasi untuk tidak spesifik Vim.

Ok, baru saja menguji ini dengan terminator dan setidaknya tampaknya berfungsi dengan file konfigurasi:

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

Terima kasih banyak. Saya lebih unset PROMPT_COMMANDsuka daripada export PROMPT_COMMAND=.
Peque

2
bash -c 'vim; exec bash'

The exec bashakan menggantikan Bash contoh saat dengan yang baru.


1
hm iya ... ini menyelesaikan masalah "kosongkan setelah keluar" ... tetapi ctrl-z masih tidak berfungsi - bash dieksekusi lagi setelah vims keluar ... Saya perlu vim di dalam bash
marvin2k

1
Saya telah menggunakan formulir ini dan hanya memperhatikan bahwa itu tidak mewarisi alias dll ketika menggunakan hanya exec bash. exec bash --loginmembantu tetapi seperti yang dicatat ini menjalankan bash di dalam bash yang tidak benar-benar seperti yang kita inginkan.
altendky

Solusi aktual. Tidak jelek. +1
Andrew

2

(Ab) menggunakan .bashrcadalah satu - satunya cara yang dapat digunakan. 1 Generasi tidak perlu, namun - cukup letakkan perintah di variabel lingkungan dan eval:

  • Letakkan yang berikut di akhir pesan Anda ~/.bashrc:

    [[ $startup_cmd ]] && {
        declare +x startup_cmd
        eval "$startup_cmd"
    }
  • Konfigurasikan Terminator untuk memulai perintah ini:

    env startup_cmd='vim' bash

1 Mari kita kecualikan yang "gunakan C4 untuk memecahkan kacang".


terlihat bagus dan berfungsi pada pandangan pertama ... harus memodifikasi bashrc, bisakah hidup dengan itu ... tapi untuk alasan apa pun, ctrl-z masih tidak berfungsi - ada ide? - dalam jenis lemari apa saya akan menemukan solusi berbasis c4?
marvin2k

0

Saya punya masalah yang sama dalam konteks ingin menelurkan vim di jendela tmux dengan kemampuan untuk ctrl-z out. Pada akhirnya, saya gagal menemukan cara melakukannya dengan bersih di dalam bash. Saya memutuskan hal berikut:

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

Terima kasih kepada wor pengguna untuk " file bashrc kustom on the fly "!

Bagian penting lainnya adalah " trap ", sebuah bash-builtin:

  • The perangkap perintah di atas hanya mendefinisikan vim akan dieksekusi jika bash menerima sinyal 12.
  • Masukkan ke latar belakang selama eksekusi rcfile, perintah kill -12 bersembunyi menunggu satu detik sehingga bash dapat menyelesaikan inisialisasi. Jika Anda mengabaikan ini, Ctrl-Z selama vim tidak akan menempatkan Anda ke dalam shell yang berfungsi .
  • Kemudian kill dieksekusi dan dengan demikian vim dimulai.
  • kill membaca proses id dari / tmp / foo. Mungkin ada cara yang lebih elegan.
  • Saya juga menguji Ctrl-Z dan berfungsi seperti yang diharapkan.

Saya tidak tahu apa "terminator" yang Anda sebutkan, omong-omong.

Saya menemukan ini saat mencari solusi dengan bash dan layar.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.