2015-06-11 1 views
1

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

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

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

-ash: syntax error: unexpected "(" 

есть ли разница в отношении чтения входного оператора < или круглых скобок ()?

+0

Да. 'ash' не поддерживает замещение процесса, которое делает' bash'. Вот что такое синтаксис '<(command)'. –

+1

Кроме того, это не всегда будет работать надежно, так или иначе. Вам, очевидно, повезло, что он до сих пор. 'find' не гарантированно возвращает список файлов в любом конкретном порядке, и порядок может измениться по мере добавления/удаления файлов/изменения/etc. Вы можете решить это, добавив '| sort' после каждого 'find', хотя, я думаю ... – twalberg

ответ

3

Не путайте угловой кронштейн в <(…) с одним из переадресаций, например cat < file. В bash <(echo hi) представляет собой файл с содержимым «привет» (по крайней мере, для чтения). Таким образом, вы можете сделать

$ cat < <(echo hi) 
hi 

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

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

И оболочка фактически расширяется, что замена процесса на имя файла.

Process substitution является отличительной чертой. Он не является частью POSIX specification и не существует в оболочках, таких как зола. Redirection, с другой стороны, является POSIX.

2

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

+2

Какая альтернатива в золе, если вам нужна замена процесса? Как способность использовать 'tee'? – CMCDragonkai