如何拦截包含特定字符串的命令?

Geo*_*Geo 0 bash

有时,我会执行某些命令,然后才意识到我向命令发送了错误的参数(例如重新启动 Heroku 应用程序)。我想以这样的方式修改 bash,如果它看到一个包含某个字符串的命令,它会提示我是否确定。例如(假设字符串是 tempus ):

$ heroku restart --app tempus
Run Code Online (Sandbox Code Playgroud)

现在,我希望 bash 用 Y/N 提示提示我,如果我输入y,那么我希望它执行命令。如果我输入 N,则不会执行该命令。我该如何处理这个问题?

Sha*_*hin 6

我不知道有什么方法可以拦截所有 bash 命令,但是您可以使用以下技巧拦截预定的命令。

  1. 创建一个目录(例如~/interception)并将其设置为$PATH
  2. 在该目录中创建以下脚本,其中包含您希望拦截的命令列表以及实际命令的完整路径

    [bash]$ cat intercept.sh
    #!/bin/bash
    
    # map commands to full path
    declare -A COMMANDS
    COMMANDS[heroku]=/usr/bin/heroku
    COMMANDS[grep]=/bin/grep
    # ... more ...
    
    CMD=$(basename $0)  # command used to call this script
    
    if [[ ! -z "${COMMANDS[$CMD]+x}" ]]; then  # mapping found
      # Do what you wish here. You can even modify/inspect the params.
      echo "intercepted $CMD command... "
    
      ${COMMANDS[$CMD]} $@   # run actual command with all params
    else
      echo "Unknown command $CMD"
    fi
    
    Run Code Online (Sandbox Code Playgroud)
  3. 在同一目录中,使用您希望拦截的命令的名称创建指向该脚本的符号链接

    [bash]$ ln -s intercept.sh grep
    [bash]$ ln -s intercept.sh heroku
    
    Run Code Online (Sandbox Code Playgroud)

现在,每次调用命令时,都会通过符号链接调用该脚本,然后它可以在调用实际命令之前进行投标。

您可以通过$COMMANDS从配置文件中获取并创建帮助命令来扩展配置文件并创建/删除符号链接来进一步扩展它。然后,您将能够使用以下命令管理 who 设置:

intercept_add `which heroku`
intercept_remove heroku
intercept_list
Run Code Online (Sandbox Code Playgroud)