如果我的命令行与特定模式匹配,则将其提供给函数或程序

如果我的命令行与特定模式匹配,则将其提供给函数或程序

我的最终目标是:

$ python3 -c "print(\"Hello, world!\")"
Hello, world!
$ >>> print("Hello, world!")
Hello, world!

基本上,每次我的命令行以 开头时,我都希望命令行的其余部分通过开关>>>输入。python3-c

如果可以声明(和使用)一个>>>函数,它将按如下方式实现:

>>>() {
    python3 -c "$@"
}

作为记录,我正在使用zsh.

我的第一次尝试是创建一个名为 的别名>>>,但它在两个 shell 中都无效。接下来我尝试创建一个>>>函数,尽管它在 ZSH 上有效,但似乎无法调用它(无论是使用>>>还是\>\>\>)。

我怎样才能实现这个目标?

答案1

由于这需要在 zsh 解析该行之前发生(因为您需要它是 python 语法,而不是 zsh 语法),因此您需要在小部件中执行此操作accept-line

accept-line() {
  emulate -L zsh
  set -o extendedglob
  case $BUFFER in
    ('>>>'*)
      zle -I
      fc -R =(print -r -- $BUFFER)
      python -c "${BUFFER##>>> #}"
      BUFFER=
      ;;
    (*) zle .$WIDGET
  esac
}
zle -N accept-line

答案2

这适用于zsh,请记住在定义函数时转义特殊字符/引号:

'>>>'() {
    python3 -c "$@"
}
'bad|idea<for>a command name'() { :; }

相关内容