Сценарий:
$ doit () { echo $1; } ; export -f doit ; doit "<xxx>"
<xxx>
$ doit () { echo $1; } ; export -f doit ; parallel doit "<xxx>" ::: 1
/usr/bin/bash: line 1: xxx: No such file or directory
Почему параллель GNU, используемая с экспортированной функцией Bash (doit
) с аргументом, заключенным в <>
(<xxx>
), приводит к No such file or directory
?
Как исправить?
@user24246119 user24246119 Спасибо, ваша команда работает. Я изменил parallel doit $x
на parallel doit \'$x\'
. Возможно, есть более элегантный/правильный способ?
можно использовать обычный шаблон, чтобы снова защитить неправильно eval
. например: printf -v command '%q' "doit $x" ; parrallel "${command}"
или parallel doit "${x@Q}"
Самый прямой способ исправить это: parallel doit "\\<xxx\\>" ::: 1
Как заметил @user24246119, проблема в следующем: <xxx>
интерпретируется как перенаправление оболочки.
Помните, что parallel
, если в команде не встречается {}
, аргумент будет помещен в конец команды.
Таким образом, команда, выполняемая parallel
, в данном случае — это doit <xxx> 1
(xxx
— файл, используемый в качестве стандартного ввода, а 1
— файл для стандартного вывода).
Вы можете увидеть, что файл 1
создан, если вы выполните команду, пока файл xxx
существует.
У вас есть разные возможности решить эту проблему, например:
parallel doit '"<xxx>"' ::: 1
x=<xxx>
, вы можете экранировать ее с помощью ${x@Q}
: parallel doit "${x@Q}" ::: 1
похоже, что аргумент
<xxx>
интерпретируется как перенаправление запущенной оболочкойdoit
. вы можете попробовать что-то вродеdoit () { echo $1; } ; export -f doit ; parallel doit '"<xxx>"' ::: 1
, чтобы проверить, так ли это