在Ruby中包装UNIX/Linux/OS X二进制文件
我正在创建一个包装UNIX/Linux/OS X命令的基本gem,并希望确保正确加载路径(即,在ruby on rails应用程序的passenger下运行时,它有'/usr/bin')。下面是一个简单的例子来说明我要做的事情(实际的例子更复杂):在Ruby中包装UNIX/Linux/OS X二进制文件,ruby,linux,unix,path,Ruby,Linux,Unix,Path,我正在创建一个包装UNIX/Linux/OS X命令的基本gem,并希望确保正确加载路径(即,在ruby on rails应用程序的passenger下运行时,它有'/usr/bin')。下面是一个简单的例子来说明我要做的事情(实际的例子更复杂): 我应该和/或可以在ruby中向路径添加公共文件夹吗?如果没有,是否可以直接引用/usr/bin/tail(或该目录中的任何其他二进制文件),或者它们将位于不同系统上的不同目录中?谢谢 您可以使用ENV全局哈希访问环境变量,例如ENV['PATH']=
我应该和/或可以在ruby中向路径添加公共文件夹吗?如果没有,是否可以直接引用
/usr/bin/tail
(或该目录中的任何其他二进制文件),或者它们将位于不同系统上的不同目录中?谢谢 您可以使用ENV
全局哈希访问环境变量,例如ENV['PATH']=ENV['PATH']+':/usr/bin'
。可以使用/bin/sh
调用命令,因为这可能会自动设置路径。您可以使用ENV
全局哈希访问环境变量,例如ENV['path']=ENV['path']+':/usr/bin'
。可以使用/bin/sh
调用命令,因为这可能会自动设置路径。在Linux和Mac操作系统上,您可以使用which
让操作系统告诉您特定命令的首选版本在哪里。例如:
Greg:stackoverflow greg$ which ls
/bin/ls
Greg:stackoverflow greg$ which find
/usr/bin/find
Greg:stackoverflow greg$ which ruby
/Users/greg/.rvm/rubies/ruby-1.9.2-p0/bin/ruby
注意,它选择了我对Ruby的偏好,而不是/usr/bin或/usr/local/bin中的偏好。这一点很重要,因为用户或系统管理员可能有一个非常有效的理由来安装新版本的命令、别名或软链接其他内容或删除它。如果您假设您比他们更了解,那么最终可能会执行一个旧的有缺陷的版本,或者忽略用户的首选环境
如果您熟悉Perl,CPAN应用程序在配置默认值时会进行大量环境感知,但它总是询问通过发现确定的默认值是否正确,并允许用户更改或删除它。它还知道类似功能的替代应用程序,例如使用ftp、nftp或wget检索文件。某些命令在操作系统中不可用。甚至Unix和/或Linux的风格也可能有所不同。在MacOS、Cygwin和其他类似Unix的环境中,您会发现相同功能的名称多种多样。在Linux和Mac OS上,您可以使用
which
让操作系统告诉您特定命令的首选版本在哪里。例如:
Greg:stackoverflow greg$ which ls
/bin/ls
Greg:stackoverflow greg$ which find
/usr/bin/find
Greg:stackoverflow greg$ which ruby
/Users/greg/.rvm/rubies/ruby-1.9.2-p0/bin/ruby
注意,它选择了我对Ruby的偏好,而不是/usr/bin或/usr/local/bin中的偏好。这一点很重要,因为用户或系统管理员可能有一个非常有效的理由来安装新版本的命令、别名或软链接其他内容或删除它。如果您假设您比他们更了解,那么最终可能会执行一个旧的有缺陷的版本,或者忽略用户的首选环境
如果您熟悉Perl,CPAN应用程序在配置默认值时会进行大量环境感知,但它总是询问通过发现确定的默认值是否正确,并允许用户更改或删除它。它还知道类似功能的替代应用程序,例如使用ftp、nftp或wget检索文件。某些命令在操作系统中不可用。甚至Unix和/或Linux的风格也可能有所不同。再加上MacOS、Cygwin和其他类似Unix的环境,您会发现相同功能有许多不同的名称