bash: รันคำสั่งที่กำหนดใน commandline และไม่ออก


13

ฉันจะระบุคำสั่งบน commmandline ของ bash ได้อย่างไรซึ่งจะดำเนินการครั้งเดียวภายใน bash ใหม่หลังจากอ่าน ~ / .bashrc - แต่ทั้งหมดนี้โดยไม่ให้ bash exit หลังจากคำสั่งเสร็จสิ้น?

ฉันเล่นซอกับ "boot-up-configuration" สำหรับterminatorที่ตัวแยกบางตัวควรเริ่มบางแอปพลิเคชั่น (vim, mutt, irrsi) หลังจากเริ่มทำงาน แต่ฉันยังต้องการเปลือกหอยปกติในพื้นหลัง (ctrl-z และอื่น ๆ ... ) ดังนั้นหลังจากออกจากแอปพลิเคชันฉันมีเปลือกเดียวกันซึ่งฉันมีในช่วงอายุการใช้งาน eapplications ...

อะไรไม่ทำงานสำหรับฉัน (ขึ้นอยู่กับคำตอบที่ได้รับ)

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

การผนวก "vim" ด้วยตนเองไปยัง bashrc ชั่วคราวจะไม่ทำงานเช่นกัน เสียงเรียกเข้าเริ่มต้นขึ้นอย่างถูกต้อง แต่ยังไม่มี bash พื้นหลังที่มี ctrl-z จะนำฉันไป

ข้อเสนอแนะใด ๆ

คำตอบ:


4

ฉันดูเหมือนจะได้พบวิธีแก้ปัญหานี้เพื่อให้การควบคุมงานทำงาน:

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

สิ่งนี้สร้างไฟล์ bashrc แบบกำหนดเองได้ทันทีและใช้ตัวแปร PROMPT_COMMAND เพื่อชะลอการเริ่ม Vim เพื่อให้การควบคุมงานทำงานได้ หลักสูตรนี้สามารถทั่วไปที่จะไม่เป็นกลุ่มเฉพาะ

ตกลงเพียงทดสอบกับเทอร์มินัลและอย่างน้อยดูเหมือนว่าจะทำงานกับไฟล์กำหนดค่า:

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

ขอบคุณมาก. ฉันชอบunset PROMPT_COMMANDมากกว่าexport PROMPT_COMMAND=แม้ว่า
Peque

2
bash -c 'vim; exec bash'

exec bashจะเข้ามาแทนที่เช่นทุบตีปัจจุบันด้วยใหม่


1
อืมใช่ ... นี่แก้ปัญหา "การแบ่งว่างเปล่าหลังจากจบการทำงาน" ... แต่ ctrl-z ยังคงไม่ทำงาน - ทุบตีจะดำเนินการอีกครั้งหลังจากออกจากขอบ ... ฉันต้องการเป็นกลุ่มในทุบตี
marvin2k

1
ฉันได้ใช้รูปแบบนี้และเพิ่งสังเกตเห็นว่ามันไม่ได้สืบทอดนามแฝง ฯลฯ exec bashเมื่อใช้เพียง exec bash --loginช่วย แต่ดังที่ระบุไว้ว่าสิ่งนี้ทำงานได้ดีใน bash ซึ่งไม่ใช่สิ่งที่เราต้องการจริงๆ
altendky

ทางออกที่แท้จริง ไม่น่าเกลียด. +1
แอนดรูว์

2

(Ab) การใช้.bashrcเป็นวิธีเดียวที่ใช้งานได้ 1 การสร้างไม่จำเป็นอย่างไรก็ตามเพียงแค่ใส่คำสั่งในตัวแปรสภาพแวดล้อมevalแล้ว:

  • ใส่ต่อไปนี้ในตอนท้ายของคุณ~/.bashrc:

    [[ $startup_cmd ]] && {
        declare +x startup_cmd
        eval "$startup_cmd"
    }
  • กำหนดค่า Terminator เพื่อเริ่มคำสั่งนี้:

    env startup_cmd='vim' bash

1ลองแยก "ใช้ C4 เพื่อแคร็ก"


ดูดีและทำงานได้อย่างรวดเร็วก่อน ... ต้องแก้ไข bashrc สามารถใช้ชีวิตกับสิ่งนั้นได้ แต่ด้วยเหตุผลใดก็ตาม ctrl-z ยังคงใช้งานไม่ได้ - มีความคิดอะไรบ้าง? - ในตู้แบบใดที่ฉันจะพบโซลูชันบนพื้นฐานของ c4
marvin2k

0

ฉันมีปัญหาเดียวกันนี้ในบริบทของการต้องการวางไข่เป็นกลุ่มในหน้าต่าง tmux ที่มีความสามารถในการ ctrl-z out ในท้ายที่สุดฉันล้มเหลวในการหาวิธีที่จะทำมันอย่างหมดจดภายในทุบตี ฉันตัดสินต่อไปนี้:

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

ขอบคุณผู้ใช้worสำหรับ " ไฟล์ bashrc ที่กำหนดเองได้ทันที "!

อีกส่วนที่สำคัญคือ " กับดัก " ซึ่งเป็น bash-builtin:

  • กับดักคำสั่งดังกล่าวเป็นเพียงแค่กำหนดเป็นกลุ่มที่จะดำเนินการถ้าทุบตีได้รับสัญญาณ 12
  • ใส่พื้นหลังในระหว่างการเรียกใช้งาน rcfile คำสั่ง lurking kill -12 รอหนึ่งวินาทีเพื่อให้ bash สามารถเริ่มต้นได้ หากคุณข้ามสิ่งนี้ไป Ctrl-Z ระหว่างที่เป็นกลุ่มจะไม่นำคุณเข้าสู่เชลล์การทำงาน
  • จากนั้นการฆ่าจะดำเนินการและทำให้เป็นกลุ่มเริ่ม
  • kill อ่าน id กระบวนการจาก / tmp / foo อาจมีวิธีที่สง่างามกว่านี้
  • ฉันยังทดสอบ Ctrl-Z และทำงานตามที่คาดไว้

ฉันไม่รู้ว่า "terminator" ที่คุณพูดถึงคืออะไรโดยวิธี

ฉันพบสิ่งนี้ในขณะที่ค้นหาวิธีแก้ปัญหาด้วย bash และหน้าจอ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.