【问题标题】:Unable to have pbcopy -clipboard inside Screen无法在屏幕内使用 pbcopy -clipboard
【发布时间】:2009-05-03 04:00:16
【问题描述】:

虽然接受了一个答案,但问题仍未解决:我们正在努力让 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

如何在 Screen 内使用 pbcopy?

【问题讨论】:

    标签: macos gnu-screen pbcopy


    【解决方案1】:

    好吧,这是一个古怪的答案,但这也是一个古怪的问题,所以至少它们是匹配的。您可以使用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 <>;
    

    【讨论】:

    • 你的第一个命令应该如何使用?能举个例子吗?
    • 'while true' 循环不会消耗大量资源吗?
    • @Peter 不,它在从管道读取时阻塞,因此在管道中有数据之前不使用处理器时间,当管道关闭 while 循环循环一次然后你阻塞再次从管道中读取。您正在考虑类似 while true 的事情;做真实的;完成了会吃掉一个cpu。这会消耗cpu,因为它执行真、循环、执行真、循环等非常迅速。解决这个问题的方法通常是在循环中设置一个睡眠以减慢它的速度,但在这种情况下我们不需要睡眠,因为阻塞读取会阻止循环循环。
    • @Masi Terminal A 不得在屏幕下运行。它需要访问 pbcopy 以便它可以访问在 screen 下运行的其他 shell。如果您不想让终端无所事事,您可以将该代码作为一个 shell 脚本变成一个您启动并忘记的守护进程。
    • 1 应该在普通 shell 中运行一次,或者在启动任何屏幕会话之前作为守护进程运行一次。 2 只是设置 1 后如何使用 1 的示例。 3 是一个 Perl 脚本,它不能通过 shell 获取,它是一个命令,它类似于你的 zsh 函数,所以你可以使用任何一个。如果您决定使用 Perl 脚本,则必须使用 chmod a+x pbcopy 使其可执行,然后将其放在 PATH 中的某个位置,该脚本位于 /usr/bin/pbcopy 之前(因此当您说 pbcopy 而不是 /usr/ 时它会执行bin/pbcopy)。我认为 zsh 函数可能是一个更清洁的解决方案。
    【解决方案2】:

    http://www.samsarin.com/blog/2008/10/18/copying-gnu-screen-buffer-to-leopard-clipboard/ 上的 osascript 有一个更简单的解决方案

    在 cmets 中,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
    

    【讨论】:

    • 没有例子我很难理解最后一个。 @我应该如何命名它? @我应该把它放在哪里?如果第一个代码调用消息中的最后一个代码,那将是有意义的。 @第一个代码在哪里调用最后一个代码?
    • 是的,所以第二个脚本只是一个简单的 bash 脚本,您应该将它放在您保存个人脚本的任何地方。 .screenrc 条目使用 writebuf 保存其复制缓冲区的内容。第二个 bash 脚本接受标准输入(就像原始的 pbcopy),所以让第一个调用第二个是没有意义的。
    • 我没有让代码工作。我也在我的 .screenrc % bind b eval "writebuf" "exec /Users/Masi/bin/pbcopyScreen.bash -c 'pbcopy
    • @Jonah:我还使用了 /usrl/local/bin 的路径,但没有成功。我不确定哪个是错误:pbcoping 或 pbpasting。 % cat /screen-exchagne % 显示没有粘贴。
    • @Masi:我正在使用这两个脚本,正如在 MaxOSX 10.5 中成功显示的那样。在屏幕中,使用 C-a [ 进入复制模式(像往常一样)并使用空格键选择要复制的文本。然后,使用 C-a b 将文本复制到剪贴板。现在在任何应用程序中 cmd-v 都会照常粘贴。旁注:/tmp/screen-exchange 不会显示任何内容,脚本指定 /tmp/screen-pbcopy
    【解决方案3】:

    您可以安装旧版本的 Macport 屏幕,这似乎可以解决此问题,如本文的 cmets 所述:
    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中,不再有:

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

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

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

    5. 退房后:

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

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

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

    【讨论】:

    • 我按照你的建议做了一切。但是,我收到以下错误消息dpaste.com/44754。我的 MacBook 中显然有当前 Leopard 附带的屏幕。我的屏幕版本是 4.00.03。
    • 是的,screen -v 为 Leopard 预装的屏幕和 macoports 的屏幕返回了相同的版本。但据我了解,Macports 的人们在将 linux 项目中的每个源代码放入 svn 之前都会对其进行修改
    • 关于你的错误,我只google了错误信息,发现:trac.macports.org/ticket/18136看看,创建票的人告诉它的问题已经这样解决了:“问题解决了:我升级到最新版本的 Apple 开发者工具。”你有最新的吗?
    【解决方案4】:

    这似乎已在 Snow Leopard 的 GNU Screen 版本中得到修复,即使它保持相同的版本号 4.00.03 (FAU) 23-Oct-06。

    您也可以更新到 Screen 4.01 版:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-05-15
      • 1970-01-01
      • 1970-01-01
      • 2017-03-15
      • 2014-02-26
      • 2012-02-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多