我已经编写了一个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
答案 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