Tôi đang cố gắng viết một kịch bản để làm như sau:
- Mở một cửa sổ đầu cuối chạy lệnh chạy dài
- (Lý tưởng nhất) di chuyển cửa sổ đầu cuối sang góc trên cùng bên trái của màn hình bằng xdotool
- Chỉ đóng cửa sổ đầu cuối nếu lệnh chạy dài đã thoát với mã trả về 0
Để đặt nó theo thuật ngữ Windows, tôi muốn có Linux tương đương start cmd /c long_running_cmd
nếu long_running_cmd
thành công và thực hiện tương đương start cmd /k long_running_cmd
nếu thất bại.
Những gì tôi có cho đến nay là một tập lệnh bắt đầu xterm với một lệnh đã cho, và sau đó di chuyển cửa sổ theo ý muốn:
#!/bin/bash
# open a new terminal window in the background with the long running command
xterm -e ~/bin/launcher.sh ./long_running_cmd &
# move the terminal window (requires window process to be in background)
sleep 1
xdotool search --name launcher.sh windowmove 0 0
Và ~ / bin / launcher.sh được dự định để chạy bất cứ thứ gì được truyền dưới dạng đối số dòng lệnh cho nó:
#!/bin/bash
# execute command line arguments
$@
Nhưng, tôi không thể đóng cửa sổ xterm sau khi long_running_cmd
hoàn thành.
Tôi nghĩ một cái gì đó giống như xterm -e ~/bin/launcher.sh "./long_running_cmd && kill $PPID" &
có thể là những gì tôi đang theo đuổi, để xterm được khởi chạy trong nền và nó chạy ./long_running_cmd && kill $PPID
. Vì vậy, shell trong cửa sổ xterm sau đó chạy lệnh chạy dài và nếu nó hoàn thành thành công, tiến trình cha của shell (tức là quá trình sở hữu cửa sổ xterm) sẽ bị hủy, do đó đóng cửa sổ xterm.
Nhưng, điều đó không hiệu quả: không có gì xảy ra, vì vậy tôi nghi ngờ việc trích dẫn hoặc thoát của tôi là không chính xác và tôi đã không thể sửa nó.
Một cách tiếp cận khác sẽ là lấy PID của long_running_cmd
, sử dụng wait
để đợi cho nó kết thúc, sau đó tắt cửa sổ xterm bằng cách sử dụng kill $!
(vì $!
tham chiếu đến nhiệm vụ cuối cùng bắt đầu trong nền, sẽ là cửa sổ xterm). Nhưng tôi không thể tìm ra một cách hay để lấy giá trị PID & thoát long_running_cmd
ra khỏi shell chạy trong cửa sổ xterm và vào shell đã khởi chạy cửa sổ xterm (viết tắt chúng vào một tệp ở đâu đó, có vẻ như nó nên không cần thiết?).
Tôi đang làm gì sai, hay có cách nào dễ dàng hơn để thực hiện điều này?