LINUX.ORG.RU

Ввод из файда: что из этого юникс уэй?

 


0

1

Есть утилита, она принимает 0..n positional аргументов (urls), но так же она может прочитать эти urls из файла.

Как лучше сделать?

  • Если len(urls) == 0, то читаем данные из STDIN.
  • Если есть данные в STDIN, то добавляем строки из него в urls.
  • Добавить опциональный аргумент --input и:
    • читаем строки из указанного файла и добавляем в urls.
    • игнорируем переданные urls, читаем их из файла.


Последнее исправление: tz4678_2 (всего исправлений: 1)

Если len(urls) == 0, то вываливаем help и завершаемся.
Если есть --file, читаем оттуда; если при этом есть еще какие-то данные, считаем аргументы избыточными, ругаемся, вываливаем help и завершаемся.

thesis ★★★★★
()
Ответ на: комментарий от tz4678_2

Ну пусть юзер передает урлы из файла путем myutil < urls.txt если тебе хочется STDIN. Без всяких –input.

thesis ★★★★★
()

grep, если не задать ему файлы в командой строке, читает stdin.

pr849
()
Ответ на: комментарий от tz4678_2

Ваш пункт:

Если есть данные в STDIN, то добавляем строки из него в urls.

не реализуем. Программа в момент запуска должна решать, обрабатывает она аргументы или STDIN. STDIN может быть pipe'ом и там данных на момент начала выполнения программы ещё может не быть.

игнорируем переданные urls, читаем их из файла.

Если брать grep, то он может взять шаблон из командной строки, может взять из файла (-f), а может из файла и из командной строки, но тогда в командной строке шаблон должен быть обозначен опцией (-e). А wget обрабатывает URL и из командной строки и из файла (опция -i). Так что сами решайте.

mky ★★★★★
()

Очевидно, аргументы командной строки задаются явно. Это касается как непосредственно указанных url, так и тех что были прочитаны из файла, заданного с помощью опции --file. В то же время, если существует предопределённый файл со списком url «по-умолчанию», то url прочитанные из него можно считать заданными неявно. В этом случае возможны два варианта:

  1. Неявно заданные параметры учитываются только тогда, когда нет явно заданных.
  2. Неявно заданные параметры учитываются всегда, но явно заданные параметры могут их дополнять и переопределять.

Если отсутствуют url заданные явно, либо неявно, то так же возможны два варианта:

  1. Это считается одним из валидных сценариев использования программы. Программа просто обрабатывает пустой список url, завершаясь без ошибок.
  2. Это не считается одним из валидных сценариев использования программы. Программа завершается с ошибкой, опционально отображая сообщение с её описанием и/или страницу помощи.
QsUPt7S ★★
()

Если len(urls) == 0, то читаем данные из STDIN.

Я бы сделал так.

Если нужна максимальная гибкость, то добавил бы возможность вместо очередного аргумента написать «–file имя-файла» (можно много) или «–stdin» (не более одного раза), тогда читать из соответствующего файла или stdin.

monk ★★★★★
()
Ответ на: комментарий от tz4678_2

Не «повисает», а ждёт из stdin.

cat [OPTION]… [FILE]…

With no FILE, or when FILE is -, read standard input.

Т.к. ты ему ничего не сунул через пайп - то ждёт из stdin с твоей консоли. Набираешь текст, жмёшь ввод - он отображает его в stdout. Который, внезапно, тоже в твоей консоли.

agentgoblin
()
Ответ на: комментарий от gremlin_the_red

При чём тут это? Мы говорим просто о запуске cat в вакууме.

agentgoblin
()
Ответ на: комментарий от mky

Программа в момент запуска должна решать, обрабатывает она аргументы или STDIN.

Это «должна решать» откуда взялось? Из каких-то соглашений, или здравый смысл подсказывает?

Laz ★★★★★
()
Ответ на: комментарий от Laz

Некорректно сформулировал. Там речь шла про то, что менять поведение программы про принципу «Если есть данные в STDIN» некорректно. И так как нельзя узнать, придёт ли что-нибудь из stdin, то программа, получившая достаточно данных из аргументов командной строки, должна их обработать и завершиться.

mky ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.