我想用shebang 执行一个gawk脚本--re-interval."幼稚"的方法
#!/usr/bin/gawk --re-interval -f
... awk script goes here
Run Code Online (Sandbox Code Playgroud)
不起作用,因为gawk是用第一个参数调用的"--re-interval -f"(不是在空白处分开),它不明白.有解决方法吗?
当然你可以不直接调用gawk,而是将它包装成一个分割第一个参数的shell脚本,或者创建一个shell脚本,然后调用gawk并将脚本放到另一个文件中,但我想知道是否有某种方法可以做这在一个文件中.
shebang行的行为因系统而异 - 至少在Cygwin中它不会通过空格分割参数.我只关心如何在一个行为类似的系统上做到这一点; 该脚本不是便携式的.
我需要在Ruby脚本中检查是否存在STDIN输入,就像mysql命令一样.如果没有任何内容指向STDIN,则脚本不应尝试读取STDIN.
如何以跨平台的方式完成?
我需要将HTML转换为等效的Markdown结构化文本.
由于我使用PHP编程,有些人表示Markdownify可以完成这项工作,但不幸的是,代码没有更新,实际上它没有用.在sourceforge.net/projects/markdownify有一个"注意:不支持 - 你想维护这个项目吗?联系我!Markdownify是一个用PHP编写的HTML到Markdown转换器.看它是html2text.php的继承者,因为它有更好的设计,更好的性能和更少的角落情况."
根据我的发现,我只有两个不错的选择:
Python:Aaron Swartz的html2text.py
Ruby:Singpolyma的html2markdown.rb,基于Nokogiri
所以,从PHP,我需要传递HTML代码,调用Ruby/Python脚本并接收输出.
(顺便说一句,一个民众在这里提出了一个类似的问题("如何从php调用ruby脚本?"),但我的案例没有实用信息).
按照Tin Man的提示(下图),我得到了这个:
PHP代码:
$t='<p><b>Hello</b><i>world!</i></p>';
$scaped=preg_quote($t,"/");
$program='python html2md.py';
//exec($program.' '.$scaped,$n); print_r($n); exit; //Works!!!
$input=$t;
$descriptorspec=array(
array('pipe','r'),//stdin is a pipe that the child will read from
array('pipe','w'),//stdout is a pipe that the child will write to
array('file','./error-output.txt','a')//stderr is a file to write to
);
$process=proc_open($program,$descriptorspec,$pipes);
if(is_resource($process)){
fwrite($pipes[0],$input);
fclose($pipes[0]);
$r=stream_get_contents($pipes[1]);
fclose($pipes[1]);
$return_value=proc_close($process);
echo "command returned $return_value\n";
print_r($pipes);
print_r($r);
}
Run Code Online (Sandbox Code Playgroud)
Python代码:
#! /usr/bin/env python
import html2text
import …Run Code Online (Sandbox Code Playgroud) 我使用的是最新版本的Chrome(32.0.1700.107)和Chrome驱动程序(V2.8).但是当我在Ruby中使用以下代码运行我的示例测试时:
require 'selenium-webdriver'
WAIT = Selenium::WebDriver::Wait.new(timeout: 100)
$driver = Selenium::WebDriver.for :chrome
$driver.manage.window.maximize
$driver.navigate.to 'https://www.google.co.in'
def apps_hover
ele_hover = $driver.find_element(:xpath, ".//*[@id='gbwa']/div[1]/a")
$driver.action.move_to(ele_hover).perform
sleep 5
puts"Pass"
end
apps_hover
$driver.quit()
Run Code Online (Sandbox Code Playgroud)
我从一开始就从chrome驱动程序获得控制台输出,如下所示:
[5032:4816:0218/130016:错误:chrome_views_delegate.cc(176)]未实现[5032:4816:0218/130016:错误:desktop_root_window_host_win.cc(746)]未实现[5032:4816:0218/130016:错误:desktop_root_window_host_win.cc(746)]未实现.
有没有办法让这些控制台输出静音?
阅读ruby文档在这里并没有太大帮助:
如果ios与终端设备(tty)关联,则返回true,否则返回false.
我希望得到一些额外的资源或解释,以帮助我更好地理解这一点.
对于上下文,我正在编写一个小命令行程序,它接受文件路径或管道内容到ruby可执行文件中并#tty?用于确定即将发生的事情.
谢谢!
我想知道是否有人试图在stdin上提供ruby程序内容.我不希望ruby回退到允许交互式输入.我该怎么做呢?
# When called in bash like this, I want 'cat.rb' to exit immediately:
ruby cat.rb
# When called in bash like this, I want to see the word 'hello':
echo hello | ruby cat.rb
Run Code Online (Sandbox Code Playgroud)
如果我只是cat.rb包含,puts gets则第一个示例将阻塞,等待交互式stdin上的EOF.我不想修改调用命令,但希望支持这两种行为.
ruby somescript.rb somehugelonglistoftextforprocessing
Run Code Online (Sandbox Code Playgroud)
这是一个坏主意吗?我应该创建一个单独的平面文件包含somehugelonglistoftextforprocessing,并让somescript.rb读取它?
如果脚本参数是非常长的文本(1KB~300KB),这有关系吗?如果有的话会出现什么问题.
如何在ruby脚本中告诉它是否已从命令行运行,即如下所示:
> ruby myscript.rb
Run Code Online (Sandbox Code Playgroud)
或者来自非互动过程,例如cron?