ruby - bash 管道在 ruby​​ #system 中不起作用,并且在 ruby​​ Shell#system 中不起作用

标签 ruby linux bash perl

我使用以下代码来获取打开的应用程序图标

xprop -notype 32c -id 109051905 _NET_WM_ICON \
                  |    perl -0777 -pe '@_=/\d+/g;
                       printf "P7\nWIDTH %d\nHEIGHT %d\nDEPTH 4\nMAXVAL 255\nTUPLTYPE RGB_ALPHA\nENDHDR\n", splice@_,0,2;
                       $_=pack "N*", @_;
                       s/(.)(...)/$2$1/gs' \
                  | convert pam:- /tmp/icon.png

有效

但是当我在 ruby​​ 中调用上面的 bash 时,管道不起作用

system %Q(xprop -notype 32c -id 109051905 _NET_WM_ICON \
                  |    perl -0777 -pe '@_=/\d+/g;
                       printf "P7\nWIDTH %d\nHEIGHT %d\nDEPTH 4\nMAXVAL 255\nTUPLTYPE RGB_ALPHA\nENDHDR\n", splice@_,0,2;
                       $_=pack "N*", @_;
                       s/(.)(...)/$2$1/gs' \
                  | convert pam:- /tmp/icon.png)

它提高了

roroco@roroco ~/Downloads $ ruby /home/roroco/Dropbox/rb/ro_cmds_global/chk/v.rb
convert: negative or zero image size `-' @ error/pnm.c/ReadPNMImage/415.
convert: no images defined `/tmp/icon.png' @ error/convert.c/ConvertImageCommand/3210.

我尝试使用Shell#system,它仍然不起作用

require 'shell'
sh = Shell.new
sh.system(%Q(xprop -notype 32c -id 109051905 _NET_WM_ICON )) | sh.system(%Q(
                   perl -0777 -pe '@_=/\d+/g;
                       printf "P7\nWIDTH %d\nHEIGHT %d\nDEPTH 4\nMAXVAL 255\nTUPLTYPE RGB_ALPHA\nENDHDR\n", splice@_,0,2;
                       $_=pack "N*", @_;
                       s/(.)(...)/$2$1/gs')) |
    sh.system(%Q(convert pam:- /tmp/icon.png))

它提高了

roroco@roroco ~/Downloads $ ruby /home/roroco/Dropbox/rb/ro_cmds_global/chk/v2.rb
shell(#<Th:0x000000015de228>): /usr/bin/xprop -notype 32c -id 109051905 _NET_WM_ICON
shell(#<Th:0x000000015de228>): /bin/sh -c 
                   perl -0777 -pe '@_=/d+/g;
                       printf "P7
WIDTH %d
HEIGHT %d
DEPTH 4
MAXVAL 255
TUPLTYPE RGB_ALPHA
ENDHDR
", splice@_,0,2;
                       $_=pack "N*", @_;
                       s/(.)(...)/$2$1/gs'
shell(#<Th:0x000000015de228>): /usr/bin/convert pam:- /tmp/icon.png
shell(#<Th:0x000000015de228>): Process finishing, but active shell exists
                               You can use Shell#transact or Shell#check_point for more safe execution.
convert: negative or zero image size `-' @ error/pnm.c/ReadPNMImage/415.
convert: no images defined `/tmp/icon.png' @ error/convert.c/ConvertImageCommand/3210.

那么如何让它发挥作用

我发现原因是,使用我使用ruby #system,perl脚本中的@_为空,所以我认为这是perl接收输入问题,如何修复它?

我可以将 perl 脚本转换为 ruby​​,也许它可以工作,但我想知道为什么 perl 无法接收 ruby​​ #system 中的输入

最佳答案

我找到了解决方案,当使用过于复杂的bash代码时,我应该使用%q()而不是%Q,以下代码将起作用:

system %q(xprop -notype 32c -id ) + 111149125.to_s + %q( _NET_WM_ICON \
                  |    perl -0777 -pe '@_=/\d+/g;
                       printf "P7\nWIDTH %d\nHEIGHT %d\nDEPTH 4\nMAXVAL 255\nTUPLTYPE RGB_ALPHA\nENDHDR\n", splice@_,0,2;
                       $_=pack "N*", @_;
                       s/(.)(...)/$2$1/gs' \
                  | convert pam:- jpg:-)

关于ruby - bash 管道在 ruby​​ #system 中不起作用,并且在 ruby​​ Shell#system 中不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51444833/

相关文章:

mysql - Rails 3.1 - 保存带有日期的多个模型

linux - 如何执行自动 Unix 输入?

bash - 如何使用 AWK 字符长度分隔列

ruby-on-rails - 将模块/类中的代码注入(inject)到另一个模块/类中

ruby-on-rails - params[key].instance_eval Ruby 解释?

linux - 带有ssh和mv命令的脚本不起作用

Android:在特定 SD 卡上禁用 fsck_msdos

bash - diff 的错误退出值是多少?

linux - bash 脚本 if 语句不显示 true

ruby-on-rails - 重写多个内联返回