2016-09-20 42 views
0

我有兩個用Ruby編寫的實用程序。第一個實用的目的不是別的,而是閱讀從HTTP鏈接文件,並轉儲其內容到標準輸出,非常相似,捲曲,讓稱它爲「mycurl」:是否可以通過Linux bash管道以某種方式傳遞參數?

mycurl http://example.com/file123.txt 

第二效用什麼都不做否則,但將其STDIN上傳到FTP服務器並將內容寫入具有給定名稱的文件中,我們稱其爲「myput」。 FTP服務器名稱和其他選項都是硬編碼的,因此不需要其他選項,而是遠程服務器上的文件名。的兩個實用工作一起通過管道的第一個命令(mycurl)向第二實用程序的STDIN(myput)的STDOUT:

mycurl http://example.com/file123.txt | myput file123.txt 

它們是單獨的實用工具,因爲經常與其他命令一起使用它們。我的問題是,「mycurl」可以從URL中確定文件名,但我仍然必須將此選項傳遞給第二個命令。這將是更方便,如果第一個命令可以以某種方式通過管道將文件名傳遞給第二個命令,或通過任何其他方法,我可以只寫這樣的:

mycurl http://example.com/file123.txt | myput 

我怎樣才能做到這一點?它有可能嗎?

+1

爲什麼不讓myput的第一行輸入是文件的名字?甚至可以使其成爲可選的:即,如果你調用myput(或者甚至是myput-'),那麼它將從第一行讀取文件名,否則它會期望一個參數。 – paddy

+0

您可能會考慮更新'mycurl'以將程序名稱作爲參數,例如'mycurl http://example.com/file123.txt -x myput'。這樣'mycurl'可以在argv [1]中用'file123.txt'調用'myput',並將HTTP響應傳遞到它的標準輸入。 – Eric

回答

1

如果你不改變mycurl打印網址STDOUT和myput解析它,或添加保存到文件選項mycurl,我不這麼認爲。

我能想到的是保存文件名可變的唯一方法:

f=file123.txt; mycurl http://example.com/$f | myput $f 
+0

如果您獲得的文件名與您在URI中請求的內容不相同,則這種方法無用。 – paddy

1

我不是一個Ruby開發者,但這似乎與curl工作。我相信你可以使它適應mycurl

require 'Open3' 

Open3.popen3("curl -sJ http://example.com/file123.txt -w '%{url_effective}' -o /dev/stderr") {|i,o,e,t| 
    f = File.basename(o.read) 
    $stdin.reopen(e) 
    exec("myput "+f) 
} 
相關問題