Bash 脚本,在 运行 脚本中杀死一个程序(vim 和 atom->editor)

Bash script, killing a program (vim and atom->editor) within the running script

有什么方法可以从 运行 脚本中 KILL/EXIT/CLOSE VI 和 ATOM 示例脚本,test.sh:

EDITOR1=vi EDITOR2=原子

$EDITOR1 helloWorld.txt $EDITOR2 file1.txt

杀死$EDITOR1 杀死 $EITOR2

是否有任何 NOT Set 方法来杀死它,我的意思是使用变量,例如文件名。

我可以想到两个办法:

通过名称终止进程。

kill `pidof $EDITOR1`

杀死最后启动的进程

vi file &
kill $!

&: 在后台启动进程(用于交互式命令行会话)
$!: 保存上次执行进程的 pid。

kill 不适用于任何 EDITOR 变量,因为其中 none 是作业 ID,kill 仅适用于作业 ID 或进程 ID。 运行 您上面的脚本不会在后台放置任何命令,一旦 EDITOR1 执行它会阻止整个程序,在该进程(由 [=14= 创建)之前什么都不能 运行 ] 被杀死。为了实现你想要的目标,你必须使用 & 在后台 运行 它们,当你使用 & 时,将创建一个 JOB ID(递增)调用 &,您必须找到一种方法来跟踪 JOB IDS。例如,如果您执行 $EDITOR1 filename.txt &;如果您执行 $EDITOR2 filename2.txt,则会创建一个工作 ID 1已创建作业 ID 2。您的案例

EDITOR1=vi ; EDITOR2=atom

declare -a JOB_ID
declare -i JOB=0;

$EDITOR1 helloword.txt &;
JOB_ID+=( $(( ++JOB )) );
$EDITOR2 file1.txt;
JOB_ID+=( $(( ++JOB )) );

kill ${JOB_ID[0]}; // kills the first job
kill ${JOB_ID[1]}; // kills the second job

或者你可以使用关联数组

EDITOR1=vi ; EDITOR2=atom

declare -A JOB_ID
declare -I JOB=0;

$EDITOR1 helloword.txt &
JOB_ID[$EDITOR1]=$(( ++JOB ));

$EDITOR2 file1.txt &
JOB_ID[$EDITOR2]=$(( ++JOB ));

kill ${JOB_ID[$EDITOR1]}; // kills the first job
kill ${JOB_ID[$EDITOR2]}; // kills the second job

我还没有尝试过这些,但它会起作用

可以使用pkill -f <filename>,如下图:

[fsilveir@fsilveir ~]$ ps -ef | grep vim
fsilveir 28867 28384  0 00:07 pts/5    00:00:00 vim foo.txt
fsilveir 28870 28456  0 00:07 pts/6    00:00:00 vim bar.txt
[fsilveir@fsilveir ~]$ 
[fsilveir@fsilveir ~]$ pkill -f bar.txt
[fsilveir@fsilveir ~]$ 
[fsilveir@fsilveir ~]$ ps -ef | grep vim
fsilveir 22344 11182  0 Mar18 pts/0    00:00:00 vim openfiles.py
fsilveir 28867 28384  0 00:07 pts/5    00:00:00 vim foo.txt
fsilveir 28958 28740  0 00:08 pts/7    00:00:00 grep --color=auto vim
[fsilveir@fsilveir ~]$ 

为什么不用killall命令,例如:

killall vim
killall atom