为什么我的名为“killl”的脚本失败,但重命名后工作正常?

为什么我的名为“killl”的脚本失败,但重命名后工作正常?

有问题的脚本终止我的本地主机端口 8080 上的最新进程。

#!/bin/bash
x=$(lsof -i:8080 | tail -1 | awk '{print $2}')
kill -9 $x

如果脚本被命名为“killl”,它就不起作用(明白了吗?Kill Latest?)。它提示我cmdsubst> 将脚本重命名为“asdf”,一切正常。这种行为有解释吗?我正在使用 MacOS El Capitán。

答案1

cmdsubst>zsh是shell 在等待输入命令替换结束时打印的辅助提示符。

如果您在刚刚输入后收到该提示killl<Return>,那么唯一合理的解释是您有一个别名(这是某种形式的字符串宏扩展),用于killl扩展为包含未终止的$(...)命令替换的内容,例如:

$ alias 'killl=echo $(lsof -ti'
$ killl :22
cmdsubst>

哪里zsh要求您关闭该$(...)命令替换。

还有一些注意事项:

  • 的输出lsof按pid排序。 pid 数字被包装,较大的 pid 并不能保证该进程稍后启动。
  • -i:8080将报告以 8080 端口作为源端口或目标端口的 TCP 或 UDP 套接字,无论它是侦听、接受还是连接套接字。
  • 如果您只想获取 pid,可以使用以下-t选项lsoflsof -ti:8080 | tail -n2
  • kill -9is kill -s KILL,它发送一个信号,表明应用程序无法正常退出。它只能作为最后的手段使用。

要终止最近启动的在端口 8080 上绑定了套接字(任一端)的进程,您可以执行以下操作:

#! /bin/sh -
unset IFS
pids=$(lsof -ti:8080) &&
  LC_ALL=C ps -o pid=,lstart= -p $pids |
  LC_ALL=C sort -k6,6n -k4,4M -k3,3n -k5,5 -k1,1n |
  awk 'END{system("kill " $1)}'

(假设 GNU sort(在 macOS 上找到)和ps支持该lstart列的实现(如 macOS 和 procps-ng,尽管必须为 procps-ng 更新代码,其中交换月份和日期字段))。

答案2

它给了我一个提示cmdsubst>

因为当你输入命令时你没有输入

杀死
你输入了

杀死$(
或类似的。这是与 无关脚本的名称,甚至它本来就是一个脚本。您可以使用完全不存在的命令达到相同的效果:

蔡克 $(
shell 的解析器需要更多输入才能完成部分完成的命令。您对脚本名称的想法完全是转移注意力的借口。

相关内容