Разница в скобках для bash и ash

Я пытался использовать команду diff для сравнения списков каталогов, которая отлично работает в bash:

diff  <(cd alpha ; find . -type f) <(cd beta; find . -type f)

Однако на пепел (встроенное устройство, где нет другой оболочки) я получаю

-ash: syntax error: unexpected "("

Есть ли разница в чтении оператора ввода < или скобки ()?

3 ответа

Решение

Не путайте угловую скобку в <( … ) с одним в перенаправлениях, таких как cat < file, В Баш, <( echo hi ) фактически это файл с содержимым "привет" (по крайней мере, для чтения). Так что вы можете сделать

$ cat < <( echo hi )
hi

Вы также можете сделать

$ echo <( : )
/dev/fd/63

И оболочка фактически расширяет подстановку этого процесса до имени файла.

Замена процесса - это особенность bash. Он не является частью спецификации POSIX и не существует в таких оболочках, как пепел. Перенаправление, с другой стороны, является POSIX.

<(command) Синтаксис замещения процесса и не поддерживается ash оболочка (и другие ограниченные / и т.д. оболочки).

Я считаю это наиболее компактным и понятным решением:

      #!/bin/sh
diff /dev/fd/3 3<<-EOF /dev/fd/4 4<<-EOF
$(sort file1)
EOF
$(sort file2)
EOF

ссылка: https://unix.stackexchange.com/a/639752/137528

Другие вопросы по тегам