variable - script bash



Pourquoi un script shell correct donnerait-il un message d'erreur enveloppé/tronqué/corrompu? (1)

TL; DR: votre script ou vos données ont des fins de ligne de style Windows CRLF.

Convertissez au style Unix en supprimant les retours chariot.

Comment vérifier si mon script ou mes données ont des retours chariots?

Ils sont détectables en tant que ^M dans la sortie de cat -v yourscript :

$ cat -v myscript
ls -l myfile^M

Si votre script ne les contient pas, vos données risquent - surtout si vous lisez à partir de fichiers ini / csv ou curl :

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

Comment puis-je les supprimer?

Configurez votre éditeur pour enregistrer le fichier avec les fins de ligne Unix, "terminaisons de ligne" ou "caractères de fin de ligne", et réenregistrez-le.

Vous pouvez également les supprimer d'une ligne de commande avec dos2unix yourscript ou cat yourscript | tr -d '\r' > fixedscript cat yourscript | tr -d '\r' > fixedscript .

Si cela se trouve dans vos données, vous pouvez diriger votre source via tr -d '\r' :

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

Pourquoi les retours chariot entraînent-ils des messages d'erreur étranges?

Le caractère "retour de chariot", également appelé CR ou \r , fait que le curseur se déplace au début de la ligne et continue à imprimer à partir de là. En d'autres termes, il commence à écraser la ligne depuis le début. C'est pourquoi ils s'enroulent étrangement:

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

Cette question a déjà une réponse ici:

J'ai un script shell avec une commande qui semble fonctionner, mais il échoue avec un message d'erreur étrange enveloppé / tronqué / corrompu. Exemple:

$ 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

Le fichier existe clairement, mais même si ce n’était pas le cas, c’est le genre de message d’erreur que je recevrais normalement:

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

Notez comment il inclut le nom de l’outil ls , une chaîne de message et le nom du fichier alors que le mien ne l’a pas.

Voici ce que je reçois si j'essaie d'utiliser mysql place. Le message d'erreur semble avoir été emballé et commence maintenant par une citation:

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

Et voici ma commande ssh triviale qui devrait fonctionner, ou du moins donner un message d'erreur normal, mais qui au lieu de cela est encapsulée pour commencer par un signe deux-points et se termine par un embrasement étrange:

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

Pourquoi cela se produit-il et comment puis-je résoudre le problème?





carriage-return