$(echo a)
— это «замена команды». $(...)
будет заменен выводом команды в . Вывод в этом случае — a
, который затем пытается выполнить оболочка. Оболочка не может найти команду с именем a
, и вы получаете сообщение об ошибке.
Неясно, каковы были ваши намерения и чего вы ожидали. Крайне необычно желание выполнить результат подстановки команд.
Некоторые программы выводят строки, которые должны быть обработаны оболочкой. Поэтому можно увидеть такой код, как
eval "$(ssh-agent)"
который оценивает (запускает )вывод данной команды. Эти команды имеют строго определенный вывод и обычно считаются безопасными для запуска таким образом. В приведенном выше примере ssh-agent
запустит процесс агента SSH и выведет несколько команд, которые установят соответствующие переменные среды, которые позже понадобятся клиенту ssh
для использования агента, например,
SSH_AUTH_SOCK=/tmp/ssh-Ppg1EO5eRIZp/agent.6017; export SSH_AUTH_SOCK;
SSH_AGENT_PID=6018; export SSH_AGENT_PID;
echo Agent pid 6018;
Это затем оценивается с помощью eval
.
eval
, а не просто $(ssh-agent)
, так как вывод команды ssh-agent
является более составной командой. Без eval
терминаторы команд ;
были бы особыми.
Пример:
$ s='echo hello; echo world'
$ $s
hello; echo world
$ eval "$s"
hello
world
Ваш исходный файл CSV представляет собой текстовый файл DOS. Текстовые файлы DOS имеют символ возврата каретки в самом конце каждой строки. Когда в системе Unix выводится символ возврата каретки, позиция курсора перемещается в начало строки, и любой дальнейший вывод будет напечатан поверх того, что уже есть.
В вашем случае третья группа захвата содержит символ возврата каретки после 0
в данных вашего примера. Поскольку \3
представляет собой 0\r
(\r
, представляющий символ возврата каретки ), вы выводите 0\r,
в конце строки. Это выводит 0
, перемещает курсор в начало строки и выводит запятую.
Преобразование входного файла в текстовый файл Unix.Это проще всего сделать с помощью такой утилиты, как dos2unix
.