bash: thực thi lệnh được đưa ra trong dòng lệnh và không thoát


13

Làm thế nào để tôi chỉ định một lệnh trên commmandline của bash sẽ được thực thi một lần bên trong bash mới sau khi đọc ~ / .bashrc - Nhưng tất cả điều này mà không để bash thoát sau khi lệnh kết thúc?

Tôi loay hoay với "cấu hình khởi động" cho terminator trong đó một số phần tách sẽ khởi động một số ứng dụng (vim, mutt, irsi) sau khi khởi động. Nhưng tôi vẫn muốn các shell bình thường ở chế độ nền (ctrl-z, v.v.) vì vậy sau khi thoát khỏi một ứng dụng, tôi có cùng một shell mà tôi có trong suốt thời gian sử dụng ...

Điều gì không làm việc cho tôi (dựa trên câu trả lời đã cho)

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

Việc thêm thủ công "vim" vào bashrc tạm thời cũng không hoạt động. vim khởi động chính xác, nhưng vẫn không có bash nền nào mà ctrl-z sẽ đưa tôi đến.

Bất kỳ đề xuất?

Câu trả lời:


4

Tôi dường như đã tìm ra cách giải quyết vấn đề này để kiểm soát công việc hoạt động:

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

Điều này tạo ra tệp bashrc tùy chỉnh nhanh chóng và sử dụng biến PROMPT_COMMAND để trì hoãn khởi động Vim để điều khiển công việc sẽ hoạt động. Điều này tất nhiên có thể được khái quát để không được Vim cụ thể.

Ok, chỉ cần thử nghiệm điều này với terminator và ít nhất dường như hoạt động với tệp cấu hình:

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

Cảm ơn rất nhiều. Tôi thích unset PROMPT_COMMANDhơn là export PROMPT_COMMAND=, mặc dù.
Peque

2
bash -c 'vim; exec bash'

exec bashsẽ thay thế cá thể Bash hiện tại bằng một thể hiện mới.


1
hm vâng ... điều này giải quyết vấn đề "phân tách trống sau khi thoát" ... nhưng ctrl-z vẫn không hoạt động - bash chỉ được thực hiện lại sau khi thoát vims ... Tôi cần vim bên trong bash
marvin2k

1
Tôi đã sử dụng biểu mẫu này và chỉ nhận thấy rằng nó không kế thừa bí danh, v.v. khi sử dụng exec bash. exec bash --logingiúp nhưng như đã lưu ý điều này chạy bash bên trong bash không thực sự hoàn toàn những gì chúng ta muốn.
altendky

Giải pháp thực tế. Không hề xấu. +1
Andrew

2

(Ab) sử dụng .bashrclà cách duy nhất có thể sử dụng. Tuy nhiên, 1 thế hệ là không cần thiết - chỉ cần đặt (các) lệnh trong một biến môi trường và evalnó:

  • Đặt phần sau vào cuối của bạn ~/.bashrc:

    [[ $startup_cmd ]] && {
        declare +x startup_cmd
        eval "$startup_cmd"
    }
  • Cấu hình Terminator để bắt đầu lệnh này:

    env startup_cmd='vim' bash

1 Hãy loại trừ những cái "sử dụng C4 để bẻ khóa".


Nhìn đẹp và hoạt động ngay từ cái nhìn đầu tiên ... phải sửa đổi bashrc, có thể sống với điều đó ... nhưng vì lý do gì, ctrl-z vẫn không hoạt động - có ý kiến ​​gì không? - trong loại tủ nào tôi sẽ tìm thấy giải pháp dựa trên c4?
marvin2k

0

Tôi gặp vấn đề tương tự trong bối cảnh muốn sinh ra vim trong cửa sổ tmux với khả năng ctrl-z. Cuối cùng, tôi đã thất bại trong việc tìm ra cách làm sạch bên trong bash. Tôi giải quyết như sau:

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

Cảm ơn người dùng wor cho " tệp bashrc tùy chỉnh nhanh chóng "!

Phần quan trọng khác là " bẫy ", một bash-dựng sẵn:

  • Lệnh bẫy ở trên chỉ định nghĩa vim sẽ được thực thi nếu bash nhận tín hiệu 12.
  • Đặt vào nền trong quá trình thực thi RCfile, lệnh kill -12 ẩn trong một giây để bash có thể hoàn thành việc khởi tạo. Nếu bạn bỏ qua điều này, một tổ hợp phím Ctrl-Z trong vim sẽ không đưa bạn vào một công tác vỏ.
  • Sau đó kill được thực thi và do đó vim được bắt đầu.
  • kill đọc id quá trình từ / tmp / foo. Có lẽ có một cách thanh lịch hơn.
  • Tôi cũng đã thử nghiệm Ctrl-Z và nó hoạt động như mong đợi.

Nhân tiện, tôi không biết "kẻ hủy diệt" mà bạn đề cập là gì.

Tôi tìm thấy điều này trong khi tìm kiếm một giải pháp với bash và màn hình.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.