Разница в скобках для 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