เพื่อเป็นการป้องกันความไม่สะดวกที่ต้องกดCTRL- zคุณสามารถสร้างสคริปต์ตัวตัดคำสำหรับโปรแกรมแก้ไขซึ่งจะเรียกใช้โปรแกรมแก้ไขของคุณในเบื้องหลัง วิธีนี้คุณไม่จำเป็นต้องดูแลการจดจำเพื่อเริ่มต้นในพื้นหลังอย่างชัดเจน:
#!/bin/sh
EDITOR="emacs" # or whatever
if [ -z "${DISPLAY}" ]; then
${EDITOR} "$@"
else
${EDITOR} "$@" &
fi
ด้านบนก่อนอื่นเราลองตรวจสอบว่าคุณมีเซิร์ฟเวอร์ X หรือไม่และจากนั้นเรียกใช้โปรแกรมแก้ไขในพื้นหลัง (หากไม่ใช่เครื่องมือแก้ไข Unix จำนวนมากจะใช้เทอร์มินัลแทนและคุณไม่ต้องการเรียกใช้โปรแกรมแก้ไขเป็นกระบวนการพื้นหลังในกรณีนี้) . มันจะส่งผ่านข้อโต้แย้งทั้งหมดไปยังบรรณาธิการของคุณคำต่อคำที่เลือก ( "$@"
) เช่นเดียวกับที่คุณให้ไว้สำหรับสคริปต์ wrapper
สำหรับคำสั่งที่คุณหายไป ... จากการทดลองขั้นพื้นฐานของฉันสำหรับโปรแกรม GUI ที่ไม่เกี่ยวข้องกับเทอร์มินัลอาจเป็นเรื่องง่ายเหมือนการส่งครั้งแรกSIGSTOP
และจากนั้นSIGCONT
ไปยังกระบวนการทำงานเบื้องหน้า (ใช้kill
คำสั่งถ้าคุณใช้เชลล์สคริปต์เพื่อใช้งาน) . แน่นอนว่าคุณจะต้องเรียกใช้มันในหน้าต่าง / แท็บเทอร์มินัลอื่นและความยากลำบากในการอำนวยความสะดวกและในการค้นหา PID ทั่วไปที่คุณต้องการส่งสัญญาณไป โดยค่าเริ่มต้นคุณสามารถส่งสัญญาณทั้งสองไปยังกระบวนการทั้งหมดของชื่อที่กำหนด (ค่าเริ่มต้นไปยังโปรแกรมแก้ไขที่คุณชื่นชอบและอนุญาตให้ใช้ PID เป็นอาร์กิวเมนต์เช่นกัน):
#!/bin/sh
EDITOR=emacs # whatever
stop_cont_prog()
{
case "$1" in
# begin with number is considered PID - this is not good
# enough to be taken seriously...
[1-9]*) kill -SIGSTOP "$1"; kill -SIGCONT "$2";;
*) killall -SIGSTOP "$1"; killall -SIGCONT "$2";;
esac
}
if [ -n "$1" ]; then
for prog in "$@"; do stop_cont_prog "$1"; done
else
stop_cont_prog "${EDITOR}"
fi
วิธีนี้ให้แท็บเทอร์มินัลอย่างถูกต้องกับฉันหลังจากใช้emacs
คำสั่ง(หลาย ๆ ) ในพื้นหลัง แต่กระบวนการ emacs ที่รันในเทอร์มินัลไม่ได้รับการกู้คืนอย่างเหมาะสมเนื่องจากการควบคุมงานของเชลล์หรือความสับสนในการตั้งค่าเทอร์มินัล ดังนั้นวิธีนี้จะได้ประโยชน์จากความซับซ้อน
SIGSTOP
เป็นสิ่งที่ส่งไปยังกระบวนการเบื้องหน้าเมื่อคุณกด (โดยค่าเริ่มต้นร่วมกัน) -CTRL zอ้างถึงstty -a
เอาต์พุต
$ stty -a
speed 38400 baud; rows 50; columns 200; line = 0;
intr = ^C; [...] start = ^Q; stop = ^S; susp = ^Z; [...]
[...]
(ตัวย่อเอาต์พุต) และstty
หน้าคู่มือ:
susp CHAR
CHAR will send a terminal stop signal
กระบวนการหยุดใช้สัญญาณสามารถเริ่มต้นใหม่โดยการส่งSIGSTOP
SIGCONT
โดยปกติมันเป็นตรรกะการควบคุมงานเชลล์ที่จะส่งSIGCONT
และดูแลการจัดการที่จำเป็นอื่น ๆ ที่เกี่ยวข้องกับfg
และbg
คำสั่งที่เราไม่สนใจ
tmux
ให้ฟังก์ชั่นเดียวกับที่ต้องการในคำถามของคุณ