bash variable Pourquoi un script shell correct donnerait-il un message d'erreur enveloppé/tronqué/corrompu?



script bash (1)

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

Convertir en style Unix en supprimant les retours de chariot.

Comment vérifier si mon script ou les données ont un retour de chariot?

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

$ cat -v myscript
ls -l myfile^M

Si votre script ne les possède pas, vos données pourraient, 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?

Définissez votre éditeur pour enregistrer le fichier avec les finitions de ligne Unix, aka "terminateurs de ligne" ou "caractères de fin de ligne", et l'annuler.

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 vous trouvez dans vos données, vous pouvez transférer votre source via tr -d '\r' :

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

Pourquoi les retours de voiture provoquent-ils des messages d'erreur étranges?

Le caractère "retour de chariot", aka CR ou \r , amène le curseur à passer au début de la ligne et continue d'imprimer à partir de là. En d'autres termes, il commence à écraser la ligne dès le début. C'est pourquoi ils s'embrouillent é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

J'ai un script shell avec une commande qui semble qu'il devrait fonctionner, mais il échoue avec un message d'erreur étrange / 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 je ne le faisais pas, 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 cela inclut le nom de l'outil ls , une chaîne de message et le nom de fichier alors que le mien ne le fait pas.

Voici ce que je reçois si j'essaie d'utiliser mysql place. Le message d'erreur semble être enveloppé et commence par un devis:

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 trivial ssh qui devrait fonctionner, ou au moins donner un message d'erreur normal, mais qui est plutôt emballé pour commencer par un colon et se termine par un clouage é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 le réparer?





carriage-return