是否有可能以某种方式通过Linux bash管道传递参数?

时间:2016-09-20 05:13:38

标签: bash curl ftp pipe parameter-passing

我有两个用Ruby编写的实用程序。第一个实用程序的目的不是别的,但是从http链接读取文件,并将其内容转储到STDOUT,非常类似于cURL,我们称之为“mycurl”:

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

第二个实用程序不执行任何操作,但将其STDIN上载到FTP服务器并将内容写入具有给定名称的文件中,我们将其称为“myput”。 FTP服务器名称和其他选项是硬编码的,因此除了远程服务器上的文件名之外不需要其他选项。这两个实用程序通过将第一个命令(mycurl)的STDOUT传递给第二个实用程序(myput)的STDIN来协同工作:

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

它们是单独的实用程序,因为我经常将它们与其他命令一起使用。我的问题是,“mycurl”可以从URL确定文件名,但我仍然必须将此选项传递给第二个命令。如果第一个命令可以通过管道或任何其他方法以某种方式将该文件名传递给第二个命令会更方便,我只能写这个:

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

我怎样才能做到这一点?它有可能吗?

2 个答案:

答案 0 :(得分:1)

如果您不更改mycurl以将网址打印到STDOUT,并myput将其解析,或者将保存到文件选项添加到mycurl ,我不这么认为。

我能想到的唯一方法是将文件名保存到变量中:

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

答案 1 :(得分:1)

我不是红宝石开发者,但这似乎与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)
}