将 shell 脚本的输出插入文本编辑器?

将 shell 脚本的输出插入文本编辑器?

我的目标是使用 bash 脚本的输出,使用系统定义的快捷键将结果字符串插入文本文件中。

该脚本(见下文)在终端中运行良好。但是当我从快捷键触发它时(我使用的是:super++ altu以防万一),我没有从脚本中得到任何“输出”。编辑器(例如,gedit)似乎“闪烁”,但什么也没发生。我猜脚本正在运行,但我没有正确“完成”脚本以供此用途(?)。

这是脚本:它获取一个 unix 时间戳(输出date +%s),将其转换为 base62,然后返回结果字符串的最后四个字符。(对于好奇的人,我使用它来为“Markdown”文本中的脚注生成合理的锚点。)

#!/bin/bash
# takes unix timestamp and converts to base62
# HT: https://stackoverflow.com/a/14472352/232251

function u2b {
  v=$(date +%s)
  BASE62=($(echo {0..9} {a..z} {A..Z}))
  for i in $(bc <<< "obase=62; $v"); do echo -n ${BASE62[$(( 10#$i ))]}
  done 
}
r=$(u2b)
echo ${r: -4}

我已经尝试使用最后一行printf ${r: -4},但是没有帮助。

我怎样才能让这个脚本/组合键为我的编辑器提供“输入”?(顺便说一下,我正在使用最新的 Ubuntu。)

答案1

将原有的bash脚本修改如下:

#!/bin/bash
# takes unix timestamp and converts to base62
# HT: https://stackoverflow.com/a/14472352/232251

function u2b {
  v=$(date +%s)
  BASE62=($(echo {0..9} {a..z} {A..Z}))
  for i in $(bc <<< "obase=62; $v"); do echo -n ${BASE62[$(( 10#$i ))]}
  done 
}
r=$(u2b)
result=$(echo ${r: -4})
echo $result # for testing only, this line can be optionally deleted afterwards
gedit - <<< $result # redirect output into gedit 

倒数第二行echo $result仅用于测试脚本。可以选择将其删除。

答案2

我从中找到了帮助Unix操作系统,并将其稍微延迟地合并到脚本中(也许我需要一个更快的例程!)给了我将该脚本的结果输入到活动窗口所需的结果:

#!/bin/bash
# takes unix timestamp and converts to base62
# HT: https://stackoverflow.com/a/14472352 | https://unix.stackexchange.com/a/393164

function u2b {
  v=$(date +%s)
  BASE62=($(echo {0..9} {a..z} {A..Z}))
  for i in $(bc <<< "obase=62; $v"); do echo -n ${BASE62[$(( 10#$i ))]}
  done 
}
r=$(u2b)
o=$(echo ${r: -4})

windowid=$(xdotool getwindowfocus)
sleep 0.5 && xdotool windowactivate --sync $windowid type "$o"

与原始帖子的更改均在最后三行,如下所示:

  • 将所需的字符串捕获到变量中;
  • 获取当前窗口的ID;
  • 让脚本运行并将输出字符串“输入”到当前窗口中。

我特别喜欢它不需要弄乱中间文件,或者以任何方式使用剪贴板。

相关内容