【问题标题】:Is it possible to pass somehow a parameter through the Linux bash pipe?是否可以通过 Linux bash 管道以某种方式传递参数?
【发布时间】:2017-01-27 21:49:18
【问题描述】:

我有两个用 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

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

【问题讨论】:

  • 为什么不将myput 的第一行输入作为文件名呢?或者甚至让它成为可选的:即如果你调用myput(甚至myput -),那么它将从第一行读取文件名,否则它会期望一个参数。
  • 您可以考虑更新mycurl 以将程序名称作为参数,例如mycurl http://example.com/file123.txt -x myput。这样mycurl 可以在 argv[1] 中调用 myputfile123.txt,并将 HTTP 响应通过管道传输到其标准输入中。

标签: bash curl ftp pipe parameter-passing


【解决方案1】:

如果您不更改 mycurl 以将 URL 打印到 STDOUT 和 myput 以解析它,或者将 保存到文件 选项添加到 mycurl,我不认为所以。

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

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

【讨论】:

  • 这在您获得的文件名与您认为在 URI 中请求的文件名不同的情况下没有用。
【解决方案2】:

我不是 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)
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-16
    • 1970-01-01
    • 2015-09-18
    • 2014-08-17
    • 2019-01-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多