繁体   English   中英

重击:回显并复制结果

[英]Bash: echo & copy result

我只是在尝试制作一个函数,该函数回显并将传递给它的内容复制到剪贴板:

function c() {
  echo "$@"
  pbcopy "$@"
}

c 123回显正确,但随后等待输入
pwd | c pwd | c复制到剪贴板但不回显

基于https://unix.stackexchange.com/questions/28503/how-can-i-send-stdout-to-multiple-commands

function c() {
  echo "$@" | tee >(pbcopy)
}

应该做到的。 我在zsh中进行了测试,但是我希望它也可以在bash中工作。

就像其他人在评论中指出的那样,pbcopy从stdin读取,它不复制参数,这就是为什么管道vs参数测试具有其结果的原因。

tee拆分管道,将stdout发送到文件,但也将其保留在stdout中。

>(command)打开一个文件描述符,该文件描述符通过管道传递给command

将两者结合起来可以让我们将参数回显到stdout,同时还将它们传递给pbcopy

此解决方案的一个警告是剪贴板将包含换行符,因为默认情况下echo会在输出中添加换行符。 通过将-n标志传递给echo可以防止这种情况。

这是一个检查是否提供参数并从stdin读取输入的函数:

c() {
    if (( $# )); then
        printf '%s\n' "$*"
        printf '%s' "$*" | pbcopy
    else
        tee >(pbcopy)
    fi
    return 0
}

那里有些麻烦的double printf可以避免换行进入剪贴板。 但是,对于从stdin读取的情况,如果您将其换行,则剪贴板中将具有该换行符:

$ c blah
blah
$ pbpaste
blah$ echo blah | c
blah
$ pbpaste
blah
$ printf blah | c
blah$ pbpaste
blah$

其中$是命令提示符,如果输出不包含换行符,则直接在输出后面。 这可能不是您想要的:我发现如果我将字符串作为参数提供,我希望换行符不会出现在字符串中,并且如果我从标准输入中读取,如果有的话,我会将换行符留在那里一。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM