Некоторые программы не допускают подстановку процессов для входных файлов? - PullRequest
5 голосов
/ 25 ноября 2010

Я пытаюсь использовать процесс подстановки для входного файла в программу, и это не работает. Это потому, что некоторые программы не допускают подстановку процессов для входных файлов?

Не работает следующее:

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 ]

7 голосов
/ 25 ноября 2010

Процесс подстановки создает именованный канал.Вы не можете искать в именованной трубе.

4 голосов
/ 25 ноября 2010

Да.Я заметил то же самое в других программах.Например, в emacs это тоже не работает.Это дает "Файл существует, но не может быть прочитан".И это определенно специальный файл для меня /proc/self/fd/some_number.И он не работает надежно ни в less, ни в most с настройками по умолчанию.

Для большинства:

most <(/bin/echo 'abcdef')

и короче ничего не показываетБолее длинные значения усекают начало.less, очевидно, работает, но только если вы укажете -f.

Я считаю, что zsh = гораздо более полезен на практике.Синтаксически то же самое, за исключением = вместо <.Но он просто создает временный файл, поэтому поддержка не зависит от программы.

РЕДАКТИРОВАТЬ:

Я обнаружил, что zsh использует TMPPREFIX для выбора временного имени файла.Так что даже если вы не хотите, чтобы ваш реальный /tmp был tmpfs, вы можете смонтировать его для zsh.

...