Имитация проблем с подключением в контейнере

La salida de una sustitución de comando está sujeta a la división de palabras (de lo que se ocupó configurando IFS), y nombre de archivo globbing. La construcción [abc]es "coincidir con cualquiera de los caracteres a, b, c" como de costumbre, y [2006_02_25].doccoincide con 0.doc.


En Bash/ksh/zsh, puede usar la estrella doble -para obtener todos los archivos en el árbol de directorios (de forma recursiva, no solo el directorio actual ). Esto debería encontrar los mismos archivos que su ejemplo:

shopt -s globstar      # in Bash
# set -o globstar      # in ksh
for file in **/* ; do
    [[ -f $file ]] || continue     # check it's a regular file, like find -type f
   ...
done

Por supuesto,findes poderoso, por lo que usarlo podría ser más fácil si tiene muchas condiciones. Si lo hace, debe deshabilitar el nombre de archivo globbing con set -fademás de corregirIFS:

set -f
IFS=$'\n'
for file in $(find -type f -some -other -conditions) ; do
   ...
done

o use un bucle while readcon sustitución de proceso en su lugar:

while IFS= read -r file ; do 
   ...
done < <(find -type f -some -other -conditions)

(Lo anterior es similar a find... | while..., pero evita el problema de que la última parte de una canalización se ejecuta en una subcapa.)

Ambos asumen que los nombres de archivo no contienen líneas nuevas, ya que se usan como separador para la salida de find.(y porque $(..)come saltos de línea finales.)

En Bash, al menos, hay una manera de hacer que las líneas nuevas en los nombres de archivo también funcionen. Establecer el delimitador readen la cadena vacía hace que use efectivamente el byte NUL como delimitador. entonces:

while IFS= read -d '' -r file ; do 
   ...
done < <(find -type f -some -other -conditions -print0)

Aunque eso está empezando a ser complicado de escribir, ya que necesita todas esas opciones readpara que funcione sin alterar la entrada.


En cuanto a IFS... Configuración IFS=$(echo -en "\n");establece IFSen la cadena vacía (porque la sustitución del comando se come la nueva línea final ),resultando en no división. La salida en este caso parece correcta ya que obtiene toda la salida de findde una sola vez, no la línea -por la línea -. Esto también enmascara el problema con el nombre de archivo globbing, ya que la cadena multilínea completa no coincide con ningún nombre de archivo y se pasa como -.

Puede ver la diferencia si hace algo más que imprimir el valor del ciclo. Intenta agregar algunos separadores:

IFS=$(echo -en "\n")       # same as IFS=
for FILE in $(find -type f); do echo "<$FILE>"; done

Con mucho, la forma más fácil de establecer IFSen una nueva línea en cualquier cosa que no sean los shells estándar más básicos es IFS=$'\n'.

0
08.02.2018, 13:32
1 ответ

Я использовал специальный контейнер между RabbitMQ и моим приложением под названием muxy:

Существуют различные виды так называемого «промежуточного программного обеспечения », которые вы можете добавить к этому прокси-серверу, чтобы имитировать различные виды сетевых проблем.

1
28.04.2021, 23:50

Теги

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