输入用户命令

时间:2019-02-08 16:50:09

标签: zsh

我已经编写了一个ZSH函数,其输出是在命令行运行我需要用户能够与之交互的程序。

此刻,我只是回显命令行,并指示用户复制粘贴它,以便他们可以访问其管道,但是有一种方法可以通过输入命令来完成功能用户,好像他们自己已经复制并粘贴了吗?

我已经研究过使用zle,但这似乎需要键绑定,而我只是希望用户能够运行:myzshfunction arg1,最终结果是将其终端附加到以对他们的arg1进行某种处理的结果。

$ myzshfunction arg2*2
Run this command! foobar baz4
$ foobar baz4
  ...

函数看起来像这样:

myzshfunction() {
  if [[ $# = 0 ]]
  then
    echo "usage: myzshfunction 1.2.3.4"
    return
  fi

  local creds=`curl "https://xxx/$1/latest" | jq -r 'x'`
  local cred_arr=("${(@s|/|)creds}")
  local pwd_pipe=$(mktemp -u)
  mkfifo $pwd_pipe
  exec 3<>$pwd_pipe
  rm $pwd_pipe
  echo $cred_arr[2] >&3
  echo "Run this: sshpass -d3 ssh -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null "$cred_arr[1]@$1"
  exec 3>&-
}

TIA

2 个答案:

答案 0 :(得分:1)

使用print -z将文本添加到缓冲区中。从文档中:

-z     Push the arguments onto the editing buffer stack, separated by spaces.

调用下面定义的foo将导致hi就像用户键入的内容一样被放置在命令行中。例如,

% foo () { print -z hi; }
% foo
% hi

答案 1 :(得分:0)

我能想到的最好的解决方案是使用zle-Zsh Line Editor

这使您可以更新用户当前正在编辑的命令,在我看来,这有点hacky。我希望有一个解决方案,让您调用一个函数,按回车键,然后干净地运行一个将STDIO连接到终端的函数,就像运行了结果命令行一样。

也许您可以通过bindkey的返回键并从那里进行某种决策/路由来模拟此情况,以查看用户是否要呼叫myfunc。目前,我的解决方案要求在输入$host的目标后输入 Esc + i 序列。

zle-myfunc() {
  apikey=$(keychain-environment-variable api-key)
  if [ $? -ne 0 ]; then
    echo "Add your api-key to the keychain: "
    BUFFER='security add-generic-password -U -a ${USER} -D "environment variable" -s "api-key" -w'
    zle accept-line
    return 1
  fi
  local host=$BUFFER
  zle kill-buffer
  local creds=`curl ..." | jq -r ...`
  if [ -z creds ]; then
    echo "Couldn't get creds, check your network"
    return 1
  fi
  local creds_arr=("${(@s|/|)creds}")
  local pwd_pipe=$(mktemp -u)
  mkfifo $pwd_pipe
  exec 3<>$pwd_pipe
  # anonymise the pipe
  rm $pwd_pipe
  echo "$creds_arr[2]" >&3
  BUFFER="sshpass -d3 ssh -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null $creds_arr[1]@$host"
  zle accept-line
  # exec 3>&-
}
zle -N zle-myfunc
bindkey '\ei' zle-myfunc