Pasta de terminales no confiable

5

Estoy tratando de pegar el texto en Terminal (v2.5 build 343, estoy ejecutando Yosemite), y parece que omite caracteres constantemente.

Por ejemplo, si copio el siguiente texto en la mesa de trabajo:

1234567890,1234567890,1234567890,1234567890,1234567890,1234567890
1234567890,1234567890,1234567890,1234567890,1234567890,1234567890
1234567890,1234567890,1234567890,1234567890,1234567890,1234567890
1234567890,1234567890,1234567890,1234567890,1234567890,1234567890
1234567890,1234567890,1234567890,1234567890,1234567890,1234567890
1234567890,1234567890,1234567890,1234567890,1234567890,1234567890
1234567890,1234567890,1234567890,1234567890,1234567890,1234567890
1234567890,1234567890,1234567890,1234567890,1234567890,1234567890
1234567890,1234567890,1234567890,1234567890,1234567890,1234567890
1234567890,1234567890,1234567890,1234567890,1234567890,1234567890
1234567890,1234567890,1234567890,1234567890,1234567890,1234567890
1234567890,1234567890,1234567890,1234567890,1234567890,1234567890
1234567890,1234567890,1234567890,1234567890,1234567890,1234567890
1234567890,1234567890,1234567890,1234567890,1234567890,1234567890
1234567890,1234567890,1234567890,1234567890,1234567890,1234567890
1234567890,1234567890,1234567890,1234567890,1234567890,1234567890
1234567890,1234567890,1234567890,1234567890,1234567890,1234567890

Luego, en el Finder Editar - > Mostrar Portapapeles Puedo verificar que el texto está todo allí.

A continuación abro la Terminal y escribo:

cat > test

Luego pegue el texto anterior y presione Ctrl + d .

En la pantalla me sale esto:

1234567890,1234567890,1234567890,1234567890,1234567890,1234567890
1234567890,1234567890,1234567890,1234567890,1234567890,1234567890
1234567890,1234567890,1234567890,1234567890,1234567890,1234567890
1234567890,1234567890,1234567890,1234567890,1234567890,1234567890
1234567890,1234567890,1234567890,1234567890,1234567890,1234567890
1234567890,1234567890,1234567890,1234567890,1234567890,1234567890
1234567890,1234567890,1234567890,1234567890,1234567890,1234567890
1234567890,1234567890,1234567890,1234567890,1234567890,1234567890
1234567890,1234567890,1234567890,1234567890,1234567890,1234567890
1234567890,1234567890,1234567890,1234567890,1234567890,1234567890
1234567890,1234567890,1234567890,1234567890,1234567890,1234567890
1234567890,1234567890,1234567890,1234567890,1234567890,1234567890
1234567890,1234567890,1234567890,1234567890,1234567890,1234567890
1234567890,1234567890,1234567890,1234567890,1234567890,1234567890
1234567890,1234567890,1234567890,1234567890,1234567890,1234567890
1234567890,12345678,1234567890,1234567890,1234567890
1234567890,1234567890,1234567890,1234567890,1234567890,1234567890

pero el contenido del archivo "prueba" coincide con el texto original que copié en la mesa de trabajo.

¿Hay alguna razón por la que Terminal eliminaría caracteres al hacer eco en la pantalla durante una operación de pegado?

    
pregunta nonagon 16.11.2014 - 02:25

1 respuesta

3

En este caso, Stdout tiene búfer de línea y tiene 1024 bytes, lo que está causando el truncamiento de salida en la pantalla. Cuando pega desde el portapapeles, los caracteres no imprimibles de Nueva Línea (EOL) al final de cada línea simplemente se cuentan como otro carácter en la línea en lo que concierne al conteo del búfer. La razón por la que los cálculos matemáticos no se suman al lugar donde ocurre el truncamiento que @miken32 estaba tratando de calcular, es porque no está contando los caracteres de Nueva Línea.

Si ejecuta el archivo de prueba con la opción –e, puede ver los caracteres EOL no imprimibles como $, e incluirlos en las matemáticas debería sumar.

$ cat -e test
1234567890,1234567890,1234567890,1234567890,1234567890,1234567890$
1234567890,1234567890,1234567890,1234567890,1234567890,1234567890$
1234567890,1234567890,1234567890,1234567890,1234567890,1234567890$
1234567890,1234567890,1234567890,1234567890,1234567890,1234567890$
1234567890,1234567890,1234567890,1234567890,1234567890,1234567890$
1234567890,1234567890,1234567890,1234567890,1234567890,1234567890$
1234567890,1234567890,1234567890,1234567890,1234567890,1234567890$
1234567890,1234567890,1234567890,1234567890,1234567890,1234567890$
1234567890,1234567890,1234567890,1234567890,1234567890,1234567890$
1234567890,1234567890,1234567890,1234567890,1234567890,1234567890$
1234567890,1234567890,1234567890,1234567890,1234567890,1234567890$
1234567890,1234567890,1234567890,1234567890,1234567890,1234567890$
1234567890,1234567890,1234567890,1234567890,1234567890,1234567890$
1234567890,1234567890,1234567890,1234567890,1234567890,1234567890$
1234567890,1234567890,1234567890,1234567890,1234567890,1234567890$
1234567890,1234567890,1234567890,1234567890,1234567890,1234567890$
1234567890,1234567890,1234567890,1234567890,1234567890,1234567890$

Puede desplazarse llenando el búfer de línea con bytes pegados si especifica su propio marcador de fin de archivo (EOF) al comando cat. De esta manera, cuando el comando cat encuentra los caracteres EOL, restablecerá el búfer de línea al comienzo de cada nueva línea en lugar de contarlos como otro byte en una secuencia continua porque el comando cat analiza cada nueva línea buscando la cadena EOF en una línea por sí misma para saber cuándo salir.

Puedes hacer algo como esto:

cat << EOF > test

La redirección estándar (< < EOF) le dice a cat que siga imprimiendo hasta que encuentre una entrada que coincida con los caracteres de final de archivo especificados en una nueva línea por sí mismos. De esta manera, stdout imprimirá cada carácter imprimido pegado línea por línea, el inconveniente es que obtiene un carácter ">" en la salida al comienzo de cada nueva línea.

$ cat << EOF > test
> 1234567890,1234567890,1234567890,1234567890,1234567890,1234567890
> 1234567890,1234567890,1234567890,1234567890,1234567890,1234567890
> 1234567890,1234567890,1234567890,1234567890,1234567890,1234567890
> 1234567890,1234567890,1234567890,1234567890,1234567890,1234567890
> 1234567890,1234567890,1234567890,1234567890,1234567890,1234567890
> 1234567890,1234567890,1234567890,1234567890,1234567890,1234567890
> 1234567890,1234567890,1234567890,1234567890,1234567890,1234567890
> 1234567890,1234567890,1234567890,1234567890,1234567890,1234567890
> 1234567890,1234567890,1234567890,1234567890,1234567890,1234567890
> 1234567890,1234567890,1234567890,1234567890,1234567890,1234567890
> 1234567890,1234567890,1234567890,1234567890,1234567890,1234567890
> 1234567890,1234567890,1234567890,1234567890,1234567890,1234567890
> 1234567890,1234567890,1234567890,1234567890,1234567890,1234567890
> 1234567890,1234567890,1234567890,1234567890,1234567890,1234567890
> 1234567890,1234567890,1234567890,1234567890,1234567890,1234567890
> 1234567890,1234567890,1234567890,1234567890,1234567890,1234567890
> 1234567890,1234567890,1234567890,1234567890,1234567890,1234567890
> EOF

El marcador de fin de archivo se escribe literalmente como los caracteres E, O, F, después de pegar y puede ser lo que quieras. También los caracteres EOF, y la > los caracteres no se incluyen en la salida redirigida enviada al archivo. Escribir las letras como EOF es simplemente simbólico y puede ser lo que quieras, por ejemplo, XXX, solo debes estar seguro de que el marcador EOF que especifiques no aparecerá en el búfer de pegado.

Para el registro, aún puedes usar ^ D como marcador EOF cuando usas la entrada estándar, incluso si especificas algo más. El uso de la cadena EOF es una convención de scripts de la vieja escuela para delimitar un bloque de texto para redirigir desde el script.

Espero que esto ayude.

    
respondido por el Michael Gagnon 31.03.2015 - 01:52

Lea otras preguntas en las etiquetas