通过ruby-e运行整个脚本的最佳方法

通过ruby-e运行整个脚本的最佳方法,ruby,shell,Ruby,Shell,我一直想在远程计算机上运行一些ruby脚本(在bash shell中) 我可以创建ruby-e”“的bash命令序列,但其中一些脚本超过100行 带有herdoc或%{}&eval()的ruby-e不能很好地处理单引号和双引号的混合 有没有更好的方法来尝试这一点 编辑: 使用的协议是Apple Remote Desktop,它在远程shell的范围内执行这些命令 如果我理解正确,您希望通过SSH或类似协议在远程计算机上运行本地ruby脚本。如果脚本是非交互式的(即不需要任何用户输入),您可以在本

我一直想在远程计算机上运行一些ruby脚本(在bash shell中)

我可以创建
ruby-e”“
的bash命令序列,但其中一些脚本超过100行

带有herdoc或
%{}
&
eval()
ruby-e
不能很好地处理单引号和双引号的混合

有没有更好的方法来尝试这一点

编辑:


使用的协议是Apple Remote Desktop,它在远程shell的范围内执行这些命令

如果我理解正确,您希望通过SSH或类似协议在远程计算机上运行本地ruby脚本。如果脚本是非交互式的(即不需要任何用户输入),您可以在本地创建它并通过
stdin
交付

换句话说,首先编写脚本并将其保存为本地,例如,
foo.rb
。然后:

ssh remotehost ruby < foo.rb
ssh-remotehost-ruby

启动SSH会话并执行远程ruby解释器。没有参数,ruby解释器从标准输入执行命令,因此我们在stdin上为SSH提供程序。

如果我理解正确,您希望通过SSH或类似协议在远程机器上运行本地ruby脚本。如果脚本是非交互式的(即不需要任何用户输入),您可以在本地创建它并通过
stdin
交付

换句话说,首先编写脚本并将其保存为本地,例如,
foo.rb
。然后:

ssh remotehost ruby < foo.rb
ssh-remotehost-ruby

启动SSH会话并执行远程ruby解释器。没有参数,ruby解释器从标准输入执行命令,因此我们在stdin上向SSH提供程序。

为什么不先发送脚本

scp foo.rb remotehost:
ssh remotehost "ruby foo.rb"
您甚至可以在以下情况下清理文件:

ssh remotehost "rm foo.rb"

为什么不先把剧本寄过来

scp foo.rb remotehost:
ssh remotehost "ruby foo.rb"
您甚至可以在以下情况下清理文件:

ssh remotehost "rm foo.rb"
这起到了作用:

cat << 'EOF' > /tmp/myscript.rb

# ruby script contents go here. any syntax is valid, except for your limit string (EOF)

EOF

ruby /tmp/myscript.rb;
rm /tmp/myscript.rb;
cat/tmp/myscript.rb
#ruby脚本的内容在这里。除限制字符串(EOF)外,任何语法都有效
EOF
ruby/tmp/myscript.rb;
rm/tmp/myscript.rb;
由于这不依赖于解释器二进制文件如何处理stdin样式的命令,因此它也适用于大多数其他语言(python、perl、php)。

这是有效的:

cat << 'EOF' > /tmp/myscript.rb

# ruby script contents go here. any syntax is valid, except for your limit string (EOF)

EOF

ruby /tmp/myscript.rb;
rm /tmp/myscript.rb;
cat/tmp/myscript.rb
#ruby脚本的内容在这里。除限制字符串(EOF)外,任何语法都有效
EOF
ruby/tmp/myscript.rb;
rm/tmp/myscript.rb;
由于这不依赖于解释器二进制如何处理stdin样式的命令,因此它也适用于大多数其他语言(python、perl、php)。

由于我也想通过ARD运行ruby脚本(我认为它不能嵌入ctrl-D),我首先认为可以将joraff的解决方案(解决他自己的问题)与Kelvin的:

cat << ENDOFSCRIPT | ruby

#Here be code ...

ENDOFSCRIPT
至少在ARD 3.6.1中有效。赢

由于我也想通过ARD运行ruby脚本(我认为它不能嵌入ctrl-D),我首先想到可以将joraff的解决方案(针对他自己的问题)与Kelvin的:

cat << ENDOFSCRIPT | ruby

#Here be code ...

ENDOFSCRIPT

至少在ARD 3.6.1中有效。赢

Hrm,我是否正确理解您试图将其推送到
ssh
invocation?Hrm,我是否正确地理解您试图将其推送到
ssh
调用?在这一点上,执行
ssh-remotehost-ruby-foo.rb
也同样有效,不是吗?不。
ssh-remotehost-ruby-foo.rb
会导致ruby从远程主机读取
foo.rb
<不,不会的
foo.rb
不在远程服务器上。“本地”,我错过了那部分。是的,你说得对。我总是将脚本作为源代码发行版的一部分推到远程端。在这一点上,执行
ssh-remotehost-ruby-foo.rb
也同样有效,不是吗?不。
ssh-remotehost-ruby-foo.rb
会导致ruby从远程主机读取
foo.rb
<不,不会的
foo.rb
不在远程服务器上。“本地”,我错过了那部分。是的,你说得对。我总是将脚本推送到远程端,作为源代码分发的一部分。因为使用的协议(Apple remote Desktop)执行远程shell范围内的所有命令。如果有的话,我必须从外部执行scp,但此过程不是交互式的。此任务不是交互式的,我不确定是否可以发送控制字符。因为使用的协议(Apple Remote Desktop)执行远程shell范围内的所有命令。如果有的话,我必须从外部进行scp,但这个过程不是交互式的。这个任务不是交互式的,我不确定是否可以发送一个控制字符。这与只运行
ruby
而不使用参数、粘贴代码(带有尾随的换行符)有什么不同吗,按ctrl-D发送EOF?这与只运行不带参数的
ruby
、粘贴代码(带尾随换行符)和按ctrl-D发送EOF有什么不同吗?