#file #perl #command-line
#файл #perl #командная строка
Вопрос:
У меня есть функция, которая принимает имя файла и печатает содержимое файла
#test.pl
while (<>) {
print $_;
}
exit(0);
Я хочу запустить это в командной строке, за исключением того, что вместо имени файла я хочу использовать фактическое содержимое в качестве параметра без изменения сценария, аналогично анонимному FIFO (например, оператору «<(…)» в оболочке), чтобы заменить строку имени файла на ее содержимое?
Комментарии:
1. Непонятно, о чем вы спрашиваете.
<>
уже можно читать из stdin (кстати, вы должны использовать<<>>
). Что вы имеете в виду, когда говорите «у меня есть функция»?2. Если вы укажете имя файла ‘-‘, то perl интерпретирует это как «чтение из STDIN», однако это также поведение по умолчанию, если вы вообще не указываете имя файла. В
bash
командной оболочке вы можете сделать что-то вроде этого:test.pl <<<"some content here which bash will supply on STDIN"
Ответ №1:
Это вопрос оболочки, но вы не указали, какая оболочка.
sh
Проще всего просто передать данные в STDIN вместо этого.
printf 'foo bar' | test.pl
printf 'foonbarn' | test.pl
test.pl <<'.'
foo
bar
.
bash
В дополнение к решениям для sh
, вы также можете использовать следующее:
test.pl <<<'foo bar'
test.pl <<<
Последний позволяет избежать использования STDIN. Это (внутренне) сложнее, чем другие решения, но позволяет передавать несколько "виртуальных файлов".
Комментарии:
1. Спасибо, что сработало. Однако это решение не работает, когда в скрипте есть несколько аргументов. Возможно ли передать данные в STDIN только для последнего параметра?
2. Как указано в ответе, последний делает.
3. Я прошу прощения за последний пример, если я хочу использовать несколько аргументов, я бы просто сделал
test.pl ARG1 <( printf 'foonbarn' )
, где <(printf 'foonbar n' ) - это ARG2 ?4. ДА. Для других решений вы можете сделать это, только если другие аргументы являются параметрами (
test.pl --foo=bar <<<'foo bar'
нормально, ноtest.pl' file.txt file2.txt <<<'foo bar'
не нормально)
foonbarn'
test.pl <( printf 'foonbarn' )
Последний позволяет избежать использования STDIN. Это (внутренне) сложнее, чем другие решения, но позволяет передавать несколько «виртуальных файлов».
Комментарии:
1. Спасибо, что сработало. Однако это решение не работает, когда в скрипте есть несколько аргументов. Возможно ли передать данные в STDIN только для последнего параметра?
2. Как указано в ответе, последний делает.
3. Я прошу прощения за последний пример, если я хочу использовать несколько аргументов, я бы просто сделал
test.pl ARG1 <( printf 'foonbarn' )
, где <(printf ‘foonbar n’ ) — это ARG2 ?4. ДА. Для других решений вы можете сделать это, только если другие аргументы являются параметрами (
test.pl --foo=bar <<<'foo bar'
нормально, ноtest.pl' file.txt file2.txt <<<'foo bar'
не нормально)