Некоторые программы не допускают подстановку процессов для входных файлов?
Я пытаюсь использовать процесс подстановки для входного файла в программу, и это не работает. Это потому, что некоторые программы не допускают подстановку процессов для входных файлов?
Следующее не работает:
bash -c "cat meaningless_name"
>sequence1
gattacagattacagattacagattacagattacagattacagattacagattaca
>sequence2
gattacagattacagattacagattacagattacagattacagattacagattaca
bash -c "clustalw -align -infile=<(cat meaningless_name) -outfile=output_alignment.aln -newtree=output_tree.dnd"
(Less verbose output, finishing with:
No sequences in file. No alignment!
Но следующие элементы управления работают:
bash -c "clustalw -align -infile=meaningless_name -outfile=output_alignment.aln -newtree=output_tree.dnd"
(Verbose output, finishing with:
CLUSTAL-Alignment file created [output_alignment.aln]
bash -c "cat <(cat meaningless_name) > meaningless_name2"
diff meaningless_name meaningless_name2
(No output: the two files are the same)
bash -c "clustalw -align -infile=meaningless_name2 -outfile=output_alignment.aln -newtree=output_tree.dnd"
(Verbose output, finishing with:
CLUSTAL-Alignment file created [output_alignment.aln]
Это говорит о том, что сама подстановка процессов работает, но что программе clustalw сама по себе не нравится подстановка процессов - возможно, потому, что она создает нестандартный файл или файлы с необычным именем файла.
Часто ли программы не принимают замещение процесса? Как я могу проверить, является ли это проблемой?
Я использую GNU bash версии 4.0.33(1)-релиз (x86_64-pc-linux-gnu) в Ubuntu 9.10. Clustalw - это версия 2.0.10.
2 ответа
Да. Я заметил то же самое в других программах. Например, в emacs это тоже не работает. Это дает "Файл существует, но не может быть прочитан". И это определенно специальный файл для меня /proc/self/fd/some_number
, И это не работает надежно ни в less
ни most
, с настройками по умолчанию.
Для большинства:
most <(/bin/echo 'abcdef')
и короче ничего не показывает. Более длинные значения усекают начало. less
видимо работает, но только если вы укажете -f
,
Я нахожу Zsh's =
гораздо полезнее на практике. Синтаксически то же самое, кроме =
вместо <
, Но он просто создает временный файл, поэтому поддержка не зависит от программы.
РЕДАКТИРОВАТЬ:
Я нашел Zsh использует TMPPREFIX
выбрать временное имя файла. Так что даже если вы не хотите, чтобы ваш реальный /tmp
быть tmpfs
Вы можете смонтировать один для Zsh.
Подстановка процесса создает именованный канал. Вы не можете искать в именованной трубе.