重击:回显并复制结果

时间:2018-12-06 21:55:51

标签: bash zsh

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

full_list.add(new ArrayList<>(arr));

function c() { echo "$@" pbcopy "$@" } 会正确回显,但仅等待输入
c 123复制到剪贴板但不回显

2 个答案:

答案 0 :(得分:1)

基于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拆分管道,将标准输出发送到文件,但也将其保留在标准输出中。

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

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

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

答案 1 :(得分:1)

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

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

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

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

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