Почему в данном случае замена процесса выполняется быстрее, чем конвейер? [дубликат]

Dos soluciones:

Un bucle de concha:

for name in /usr/bin/*file*; do
   case "${name##*/}" in
        *[!a-z]*) ;;
        *) printf '%s\n' "$name"
   esac
done

Esto primero genera una lista de nombres de ruta bajo /usr/bincuyo nombre base coincide con *file*y luego comprueba si esos nombres base también contienen caracteres que no son letras minúsculas. Si no se encuentran letras minúsculas que no sean -, se imprime el nombre de ruta.

Esto potencialmente también encontraría nombres de directorios que cumplan con los criterios. Si eso no es lo que quieres, solo haz

[ ! -f "$name" ] && continue

antes de la instrucción casepara omitir todos los nombres que no sean archivos normales.

Usando GNUfind:

find /usr/bin -maxdepth 1 -type f -name '*file*' -regex '.*/[a-z]*$'

Esto también hace un filtrado de dos etapas. Primero en el nombre base que debe coincidir con *file*, y luego al final del nombre de ruta(-regexcoincide con el nombre de ruta completo )para asegurarse de que solo haya letras minúsculas allí.

1
30.03.2018, 04:30
1 ответ

При использовании конвейера оболочка выполняет каждую команду в конвейере одновременно и ждет завершения всех из них, прежде чем перейти к следующей команде. Это объясняется в документации :

.

If the pipeline is not executed asynchronously (see Lists), the shell waits for all commands in the pipeline to complete.

Когда вышеприведенное относится к асинхронному выполнению конвейера, речь идет о запуске всего конвейера в фоновом режиме с &.

Когда вы используете подстановку процесса, оболочка не ожидает ее завершения. Документация просто говорит:

The process list is run asynchronously, and its input or output appears as a filename.

2
27.01.2020, 23:32

Теги

Похожие вопросы