有时,我会执行某些命令,然后才意识到我向命令发送了错误的参数(例如重新启动 Heroku 应用程序)。我想以这样的方式修改 bash,如果它看到一个包含某个字符串的命令,它会提示我是否确定。例如(假设字符串是 tempus ):
$ heroku restart --app tempus
Run Code Online (Sandbox Code Playgroud)
现在,我希望 bash 用 Y/N 提示提示我,如果我输入y,那么我希望它执行命令。如果我输入 N,则不会执行该命令。我该如何处理这个问题?
我不知道有什么方法可以拦截所有 bash 命令,但是您可以使用以下技巧拦截预定的命令。
~/interception)并将其设置为$PATH在该目录中创建以下脚本,其中包含您希望拦截的命令列表以及实际命令的完整路径
[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)在同一目录中,使用您希望拦截的命令的名称创建指向该脚本的符号链接
[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)