2016-09-20 1 views
0

У меня есть две утилиты, написанные на Ruby. Цель первой утилиты нет ничего другого, но чтение файла из ссылки HTTP, и сбросить его содержимое в STDOUT, очень похожий на локон, позволяет называть его «mycurl»:Можно ли каким-либо образом передать параметр через трубу Linux bash?

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

Вторая утилита ничего не делает else, но загружает свой STDIN на FTP-сервер и записывает содержимое в файл с заданным именем, позволяет называть его «myput». Имя FTP-сервера и другие параметры жестко запрограммированы, поэтому нет необходимости в других параметрах, кроме имени файла на удаленном сервере. Две утилит работают вместе по конвейеру STDOUT первой команды (mycurl) к STDIN второй полезности (myput):

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' мог вызывать' myput' с 'file123.txt' в argv [1], а HTTP-ответ был отправлен в его stdin. – Eric

ответ

1

Если не изменится mycurl для печати URL в STDOUT и myput разобрать его, или добавить сохранить в файл опцию mycurl, я не думаю, что так.

Единственный способ, которым я могу думать сохраняет имя файла в переменную:

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

Это не было бы полезно в случае, когда имя файла, которое вы получаете, не совпадает с тем, что вы считаете запрошенным в URI. – paddy

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) 
}