scripts script resueltos programas pasar parametros manejo español ejercicios ejemplos cadenas bash shell sh carriage-return

bash - resueltos - ¿Por qué un script de shell correcto daría un mensaje de error envuelto/truncado/dañado?



scripts linux ejercicios resueltos (1)

TL; DR: su secuencia de comandos o datos tiene terminaciones de línea CRLF estilo Windows.

Convierta al estilo Unix eliminando los retornos de carro.

¿Cómo verifico si mi script o datos tienen retornos de carro?

Son detectables como ^M en la salida de cat -v yourscript :

$ cat -v myscript ls -l myfile^M

Si su script no los tiene, sus datos podrían, especialmente si lee de archivos ini / csv o curl :

hostname=$(curl https://example.com/loginhost.txt) ssh "$hostname" # Shows strange error echo "$hostname" | cat -v # Shows myhost^M

¿Cómo los elimino?

Configure su editor para guardar el archivo con finales de línea Unix, también conocidos como "terminadores de línea" o "caracteres de fin de línea", y vuelva a guardarlo.

También puede eliminarlos de una línea de comandos con dos2unix yourscript o cat yourscript | tr -d ''/r'' > fixedscript cat yourscript | tr -d ''/r'' > fixedscript .

Si se encuentra en sus datos, puede canalizar su fuente a través de tr -d ''/r'' :

hostname=$(curl https://example.com/loginhost.txt | tr -d ''/r'')

¿Por qué los retornos de carro causan mensajes de error extraños?

El carácter de "retorno de carro", también conocido como CR o /r , hace que el cursor se mueva al inicio de la línea y continúe imprimiendo desde allí. En otras palabras, comienza a sobrescribir la línea desde el principio. Es por eso que se envuelven de manera extraña:

Intended: ssh: Could not resolve hostname myhost/r: Name or service not known Written: ssh: Could not resolve hostname myhost/r Overwritten: : Name or service not known ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Result: : Name or service not knownname myhost

Esta pregunta ya tiene una respuesta aquí:

Tengo un script de shell con un comando que parece que debería funcionar, pero en su lugar falla con un mensaje de error extraño envuelto / truncado / dañado. Ejemplo:

$ ls -l myfile -rw-r----- 1 me me 0 Aug 7 12:36 myfile $ cat myscript ls -l myfile $ bash myscript : No such file or directory

El archivo existe claramente, pero incluso si no lo tuviera, este es el tipo de mensaje de error que normalmente recibiría:

$ ls -l idontexist ls: cannot access idontexist: No such file or directory

Observe cómo incluye el nombre de la herramienta ls , una cadena de mensaje y el nombre del archivo, mientras que el mío no.

Esto es lo que obtengo si intento usar mysql lugar. Parece que el mensaje de error ha sido envuelto, y ahora comienza con una cita:

Command: mysql -h myhost.example.com Expected: ERROR 2005 (HY000): Unknown MySQL server host ''myhost.example.com'' (0) Actual: '' (0) 2005 (HY000): Unknown MySQL server host ''myhost.example.com

Y aquí está mi comando trivial ssh que debería funcionar, o al menos dar un mensaje de error normal, pero que en cambio está envuelto para comenzar con dos puntos y termina con un extraño golpeteo:

Command: ssh myhost Expected: ssh: Could not resolve hostname myhost: Name or service not known Actual: : Name or service not knownname myhost

¿Por qué sucede esto y cómo lo soluciono?