管道读取命令?

管道读取命令?

我正在尝试通过管道传输带有特殊字符的字符串(例如HG@eg3,l'{TT\"C!到另一个命令(termux 剪贴板集)与read程序。似乎read旨在创建一个临时变量(例如read temp),然后将其传递给另一个命令(例如termux-clipboard-set $temp)。

我想知道是否有更快的方法来使用管道来做到这一点,例如:read | termux-clipboard-set

更新:抱歉,我忘了提及我正在寻找可以在 bash (termux) 上运行的东西。

答案1

对于bashread不是一个程序。read是一个内置的。简化后,read读取stdin输入并将其分配给变量。内置read函数不会在 上产生任何输出stdout,因此尝试通过管道传输stdout不会产生任何结果。

问题是为什么。根据man页面显示,

用法termux-clipboard-set [text]

文本从标准输入或命令行参数读取。

如果文本是从 读取的stdin,为什么要在前面放一些东西?当然,你可以cat | termux-clipboard-set,但只termux-clipboard-set要这样做就可以了。

答案2

在 中zsh,内置read支持cho-e选项e

termux-clipboard-set "$(IFS= read -re)"

如果您的系统仍然有一个line命令(仍然有一个,util-linux但现在通常不包括在内),并且使用任何类似 POSIX 的 shell:

termux-clipboard-set "$(line)"

line命令可以写成 sh 函数,如下所示:

line() (
  IFS= read -r line; ret=$?
  printf '%s\n' "$line"
  exit "$ret"
)

head -n 1做类似的事情,除了当不从终端读取时,大多数实现会按块读取,然后可能从输入中读取多于一行,即使它们只输出一行。readline保证不会(尽管您需要确保使用-r的选项read)。

通过来自终端的输入,

termux-clipboard-set "$(head -n1)"

不过应该可以。大多数head实现仍然支持过时的(但更短)head -1

对于 tcsh,那就是:

termux-clipboard-set $<:q

1 它们还从终端设备按块读取,但read()处于模式的终端设备上的 sicanon不会返回超过一行。

相关内容