无法在屏幕内部使用pbcopy -clipboard

时间:2009-05-03 04:00:16

标签: macos gnu-screen pbcopy

问题尽管有一个答案被接受但未解决:我们正努力让Jonah的代码正常运作。

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

我知道thread。我希望能够在Screen

中运行以下代码

代码(1)

cat ~/.vimrc | pbcopy                   (1)

代码(2)

cat ~/.vimrc > /tmp/pbcopy.pipe         (2)

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

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

我得到了

cat masi | pbcopy          
pbcopy: command not found: (cat "")
cat: masi: No such file or directory

如何在屏幕内使用pbcopy?

4 个答案:

答案 0 :(得分:6)

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

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

/usr/bin/mkfifo /tmp/pbcopy.pipe
while true; do /bin/cat /tmp/pbcopy.pipe | /usr/bin/pbcopy; done

您可能希望将其转换为shell脚本(这可能应该更强大)

#!/bin/bash

if [[ -e /tmp/pbcopy.pipe ]]; then
    echo "it looks like I am already running"
    echo "remove /tmp/pbcopy.pipe if you are certain I am not"
    exit 1
fi

while true; do
    /bin/cat /tmp/pbcopy.pipe | /usr/bin/pbcopy
done

您可以将其命名为pbcopy_server.sh,制作可执行文件(chmod a+x pbcopy_server.sh)并放在路径中的某个位置,这样您就可以在首次启动计算机时说出nohup pbcopy_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脚本,并将其放在PATH中早于/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 <>;

答案 1 :(得分:1)

http://www.samsarin.com/blog/2008/10/18/copying-gnu-screen-buffer-to-leopard-clipboard/

中使用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,这是一个模拟屏幕内pbcopy行为的bash脚本。欢迎对此脚本进行改进:

将此代码保存为路径中的某个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

答案 2 :(得分:0)

您可以安装较旧版本的Macport屏幕,似乎可以解决此问题,如本文评论中所述:
link to the last comment explaining how to do

我已经尝试过自己,屏幕效果非常好,现在使用pbcopy! : - )

检查步骤:

  1. 使用DMG文件安装Macport。 Leopard's DMG

  2. 启动新终端
    $ sudo vi /opt/local/etc/macports/sources.conf
    最后这两行只保留在sources.conf中,不再是:

    文件:///用户/ XXXXX /端口
    rsync://rsync.macports.org/release/ports/ [default]

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

  4. $ cd ports/sysutils/
    $ svn co -r 45745 http://svn.macports.org/repository/macports/trunk/dports/sysutils/screen

  5. 退房后:

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

    Total number of ports parsed:   1 
    Ports successfully parsed:  1    
    Ports failed:           0
    
  6. $ sudo port install screen (可能需要一段时间来下载屏幕并建立它)

  7. 然后就完成了,只需启动/ opt / local / bin / screen。

答案 3 :(得分:0)

这似乎是在Snow Leopard版本的GNU Screen中修复的,即使它保持相同的版本号4.00.03(FAU)2006年10月23日。

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

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