![管道读取命令?](https://linux22.com/image/226206/%E7%AE%A1%E9%81%93%E8%AF%BB%E5%8F%96%E5%91%BD%E4%BB%A4%EF%BC%9F.png)
我正在尝试通过管道传输带有特殊字符的字符串(例如HG@eg3,l'{TT\"C!
到另一个命令(termux 剪贴板集)与read
程序。似乎read
旨在创建一个临时变量(例如read temp
),然后将其传递给另一个命令(例如termux-clipboard-set $temp
)。
我想知道是否有更快的方法来使用管道来做到这一点,例如:read | termux-clipboard-set
?
更新:抱歉,我忘了提及我正在寻找可以在 bash (termux) 上运行的东西。
答案1
对于bash
,read
不是一个程序。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
做类似的事情,除了当不从终端读取时,大多数实现会按块读取,然后可能从输入中读取多于一行,即使它们只输出一行。read
并line
保证不会(尽管您需要确保使用-r
的选项read
)。
通过来自终端的输入,
termux-clipboard-set "$(head -n1)"
不过应该可以。大多数head
实现仍然支持过时的(但更短)head -1
。
对于 tcsh,那就是:
termux-clipboard-set $<:q
1 它们还从终端设备按块读取,但read()
处于模式的终端设备上的 sicanon
不会返回超过一行。