Macos 无法在屏幕内设置pbcopy-剪贴板

Macos 无法在屏幕内设置pbcopy-剪贴板,macos,gnu-screen,pbcopy,Macos,Gnu Screen,Pbcopy,问题没有解决,尽管有一个答案被接受:我们正在努力让乔纳的代码正常工作 问题:将(1)的代码更改为(2) 我知道答案。我希望能够在屏幕内运行以下代码 代码(1) cat ~/.vimrc | pbcopy (1) 代码(2) 我解决问题的尝试: 将以下代码放入.zshrc function pbcopy() { "(cat \"$1\")" > /tmp/pbcopy.pipe } 我明白了 如何在屏幕内使用pbcopy?好吧,这是一个古怪的答案,

问题没有解决,尽管有一个答案被接受:我们正在努力让乔纳的代码正常工作

问题:将(1)的代码更改为(2)

我知道答案。我希望能够在屏幕内运行以下代码

代码(1)

cat ~/.vimrc | pbcopy                   (1)
代码(2)

我解决问题的尝试: 将以下代码放入.zshrc

function pbcopy() { "(cat \"$1\")"  > /tmp/pbcopy.pipe } 
我明白了


如何在屏幕内使用pbcopy?

好吧,这是一个古怪的答案,但也是一个古怪的问题,所以至少它们是匹配的。您可以使用创建命名管道,然后设置一个无限循环,从命名管道读取文件并将其传送到
pbcopy
(或
xsel
xclip
,等等)

1。在不在屏幕会话中的终端中(仅运行一次):

您可能希望将其转换为shell脚本,如(这可能会更健壮)

您可以将其命名为
pbcopy\u server.sh
,使其成为可执行文件(
chmod a+x pbcopy\u server.sh
),并将其放置在路径中的某个位置,这样您可以在第一次启动计算机时说
nohup pbcopy\u server.sh&

2。在任何其他终端(包括屏幕会话中的终端)中,您现在可以使用cat文件(或将程序输出重定向到/tmp/pbcopy.pipe),文本将显示在剪贴板中

cat file > /tmp/pbcopy.pipe

df -h > /tmp/pbcopy.pipe
3.要让它看起来像你在调用真正的
pbcopy
你可以使用一些东西来为你进行分类
/tmp/pbcopy.pipe

3a.使用
zsh
功能:

function pbcopy() { cat > /tmp/pbcopy.pipe }
3b.或创建一个名为
pbcopy
的Perl脚本,并将其放在
路径中早于
/usr/bin
的目录中:

#!/usr/bin/perl

use strict;
use warnings;

open my $out, ">", "/tmp/pbcopy.pipe"
   or die "could not open pipe to pbcopy: $!\n";

print $out $_ while <>;
!/usr/bin/perl
严格使用;
使用警告;
打开我的$out,“>”,“/tmp/pbcopy.pipe”
或“无法打开到pbcopy:$!\n”的管道;
打印$out$\uuwhile;

您可以安装旧版本的Macport屏幕,这似乎可以解决此问题,如本文评论所述:

我自己也试过了,现在用pbcopy屏幕工作得很好!:-)

检查该步骤:

  • 使用其DMG文件安装Macport

  • 启动新终端
    $sudo vi/opt/local/etc/macports/sources.conf

    最后,这两行代码只保留在sources.conf中,不再保留:

    file:///Users/xxxxx/ports
    rsync://rsync.macports.org/release/ports/ [默认值]

  • $cd
    $mkdir-p ports/sysutils/
    (不要创建“屏幕”目录,svn会)

  • $cd端口/sysutils/
    $svn公司-r 45745http://svn.macports.org/repository/macports/trunk/dports/sysutils/screen

  • 退房后:

    $cd$HOME/端口
    $portindex
    在/Users/keugarg/ports中创建软件索引 添加端口sysutils/screen

    Total number of ports parsed:   1 
    Ports successfully parsed:  1    
    Ports failed:           0
    
  • $sudo端口安装屏幕
    (下载和构建屏幕可能需要一段时间)


  • 完成后,只需启动/opt/local/bin/screen即可。

    有一个更简单的解决方案,只需使用osascript即可

    在评论中,Andrew Wason提供了复制屏幕缓冲区的解决方案:

    .screenrc中的代码

    # binds C-a b to copy the contents of your last screen copy to the MacOSX pasteboard
    bind b eval "writebuf /tmp/screen-pbcopy" "exec /usr/bin/osascript -e 'tell application \"System Events\"' -e 'set the clipboard to (read posix file \"/tmp/screen-pbcopy\" as text)' -e 'end tell'"
    
    同样使用osascript,这里有一个bash脚本,它模拟了屏幕中pbcopy的行为。欢迎对此脚本进行改进:

    将此代码保存为路径中某个位置的bash脚本,例如:~/bin/pbcopyScreen.bash

    #!/bin/bash
    
    # saves all standard input to a file
    cat > /tmp/screen_pbcopy_kludge_buffer
    
    # uses osascript to set the MacOSX pastebaord to the contents of the file
    /usr/bin/osascript -e 'tell application "System Events"' -e 'set the clipboard to (read posix file "/tmp/screen_pbcopy_kludge_buffer" as text)' -e 'end tell'
    
    rm /tmp/screen_pbcopy_kludge_buffer
    

    这似乎在雪豹版GNU屏幕中得到了修复,尽管它保持了相同的版本号4.00.03(FAU)2006年10月23日

    或者,您可以更新到屏幕版本4.01:

    git clone git://git.savannah.gnu.org/screen.git
    

    您的第一个命令应该如何使用?你能举个例子吗?“while true”循环不是消耗了很多资源吗?@Peter不,它阻塞了从管道中读取的数据,因此在管道中有数据之前不使用处理器时间,当管道关闭while循环一次,然后你又阻塞了从管道中读取的数据。你在想一些事情,比如说,虽然是真的;做真实的事;完成这将消耗一个cpu。这会消耗cpu,因为它执行true,循环,执行true,循环等非常快。解决这个问题的方法通常是在循环中加入睡眠来降低速度,但在这种情况下我们不需要睡眠,因为阻塞读取会阻止循环。@Masi终端a不能在屏幕下运行。它需要访问pbcopy,以便能够访问在屏幕下运行的其他shell。如果您不想让终端无所事事,您可以将该代码作为shell脚本放入一个守护进程中,然后启动并忘记。1应该在普通shell中运行一次,或者在启动任何屏幕会话之前作为守护进程运行一次。2只是设置1后如何使用1的示例。3是一个Perl脚本,它不能由shell提供源代码,它是一个命令,它类似于您的zsh函数,因此您可以使用任何一个。如果决定使用Perl脚本,则必须使用chmod a+x pbcopy使其可执行,然后将其放在路径中的某个位置,该路径位于/usr/bin/pbcopy之前(因此,当您说pbcopy而不是/usr/bin/pbcopy时,它会执行)。我认为zsh函数可能是一个更干净的解决方案。我按照你的建议做了一切。但是,我收到以下错误消息。很明显,我的MacBook中有一个屏幕,它是Leopard当前附带的。我的屏幕版本是4.00.03。没错,Screen-v为Leopard预装屏幕和macoports屏幕返回了相同的版本。但据我所知,Macports的人在将linux项目的每个源代码放入SVN之前都在对其进行重大修改。为了找出您的错误,我只在谷歌上搜索了错误消息,发现:看一看,创建票证的人
    Total number of ports parsed:   1 
    Ports successfully parsed:  1    
    Ports failed:           0
    
    # binds C-a b to copy the contents of your last screen copy to the MacOSX pasteboard
    bind b eval "writebuf /tmp/screen-pbcopy" "exec /usr/bin/osascript -e 'tell application \"System Events\"' -e 'set the clipboard to (read posix file \"/tmp/screen-pbcopy\" as text)' -e 'end tell'"
    
    #!/bin/bash
    
    # saves all standard input to a file
    cat > /tmp/screen_pbcopy_kludge_buffer
    
    # uses osascript to set the MacOSX pastebaord to the contents of the file
    /usr/bin/osascript -e 'tell application "System Events"' -e 'set the clipboard to (read posix file "/tmp/screen_pbcopy_kludge_buffer" as text)' -e 'end tell'
    
    rm /tmp/screen_pbcopy_kludge_buffer
    
    git clone git://git.savannah.gnu.org/screen.git