6
votes

Programmation Bash (Cygwin): Caractère illégal ^ m

J'ai un problème avec un personnage. Je pense que c'est un problème de conversion entre DOS et UNIX.

J'ai une variable qui est une valeur de flotteur. Quand je l'imprime avec la commande echo, je reçois: p> xxx pré>

mais quand j'essaie de faire une opération sur cette valeur avec la commande BC (je ne sais pas comment écrire le Commande BC). P>

(standard_in) 1 : illegal character: ^M


4 commentaires

Comment $ moyenne obtenu?


Utilisation de la commande ImageMagick "Identifier". Mais comme je suis sur Windows, cela donne peut-être son résultat dans un format DOS et non au format UNIX. Qu'est-ce qui cause un caractère de transport à ajouter?


Ok, mais quelle est la commande que vous exécutez donc $ moyenne est peuplé? Quelque chose comme moyen = `Identifier ...` ... Nous avons besoin de la ligne complète.


moyenne = Identifier -Colorspace gris -format% [FX: moyenne] $ jpg_frame1


7 Réponses :


1
votes

Peut-être que vous devriez simplement enregistrer votre script au format UNIX au lieu de DOS.


3 commentaires

J'utilise déjà la commande Dos2unix pour la convertir. Est-ce ce que tu veux dire?


Oui c'est le cas. Je ne sais pas pourquoi utiliser Dos2unix n'a pas résolu votre problème. Le code a l'air bien envers moi. Je l'ai essayé et ça marche bien. Mais si je sauvegarde le script en mode DOS, je reçois la même erreur: (standard_in) 1: caractère illégal: ^ m . Habituellement, je n'utilise pas Dos2unix, juste parce que je suis plus à l'aise avec un éditeur. Pour reproduire votre code, j'ai utilisé PSPAD . C'est gratuit, vous pourriez peut-être essayer.


Merci je vais essayer pspad



0
votes

Essayez ceci:

echo `echo $mean` *1000 |bc


2 commentaires

C'est une bonne pensée, mais ça ne va pas aider. Si moyenne moyenne contient ^ m et bash reconnaît ^ m comme séparateur de mots (qui, par défaut, il fait pas < / I>), alors echo $ moyenne * 1000 déposera déjà le ^ m , car $ moyenne n'est pas cité. Si c'est est echo qui ajoute le ^ m , il ne fonctionnera évidemment pas (comme vous le réalisez), et si le < code> ^ m est dans la variable et bash n'est pas la reconnaissant comme un séparateur de mots, alors le ECHO imprimera toujours le ^ M et le echo le répéteront - rien gagné.


@ruakh tu as raison, je ne l'avais pas pensé très à travers!



0
votes

^ m est un Retour de chariot personnage utilisé dans Windows avec le caractère Newline ( \ n ) pour indiquer la ligne suivante. Cependant, ce n'est pas la façon dont il est fait dans Unix World, et donc bash ne traite pas comme un caractère spécial et casse la syntaxe. Ce que vous devez faire est de supprimer ce personnage en utilisant l'une des nombreuses méthodes. Dos2unix peut venir utile, par exemple.


1 commentaires

Comme je l'ai mentionné, j'ai déjà utilisé la commande Dos2unix sur mes fichiers .sh. Est-ce ce que tu veux dire ou dois-je utiliser d'une autre manière?



13
votes

Je n'ai pas de Cygwin Handy, mais dans une bash ordinaire, vous pouvez utiliser la commande tr -d code> pour supprimer des caractères spécifiés et utiliser le $ '... ' Code> Notation Pour spécifier des caractères étranges dans un argument de ligne de commande (c'est comme une chaîne de cité unique normale, sauf qu'il prend en charge les séquences d'échappement C / Java / Perl / etc.). Donc, ceci:

mean=$(echo "$mean" | tr -d $'\r')


1 commentaires

C'est en fait la meilleure pratique de convertir la chaîne de style ansi-c en entier, je pense. Seule une solution qui a fonctionné pour moi!



2
votes

Ceci fonctionne:

$ {moyenne / ^ m /}

Vous pouvez obtenir ^ m en tapant Ctrl-V suivi de CTRL-M. Ou, alternativement:

$ {moyenne / $ (printf "\ r") /}

Le bénéfice de cette méthode par rapport à @ruakh est que vous utilisez ici uniquement des bâtiments intégrés. Le premier sera plus rapide que la seconde fonctionnera à l'intérieur d'un sous-vase.

Si vous voulez juste "unixiser" $ moyenne:

moyenne = "$ {moyenne / ^ m /}"

edit: Il y a un autre méthode:

$ {moyenne / $ '\ r' /}


0 commentaires

0
votes

Comme d'autres ont souligné, il s'agit d'une question de fin de ligne Windows. Il existe de nombreuses façons de résoudre le problème, mais la question est pourquoi cela s'est produit-il en premier lieu.

Je peux voir cela se produire à plusieurs endroits:

  • Il s'agit d'une variable d'environnement Windows qui a été définie lorsque Cygwin a démarré. Parfois, ces variables reçoivent un CRLF à la fin d'eux. Vous avez mentionné que c'était un problème particulier avec cette variable, mais vous n'avez pas spécifié où il a été défini.

  • Vous avez édité ce fichier à l'aide d'un texte Notepad ou winpad .

    Ne jamais utiliser un éditeur de texte pour éditer un programme . Utilisez un éditeur de programme. Si vous aimez VI, téléchargez vim disponible sous Windows et est disponible sur Cygwin (et toutes les autres plates-formes UNIX) . Si Vim n'est pas pour vous, essayez plus graphiquement Notepad ++ . Ces deux éditeurs gèrent les problèmes de fin de ligne et peuvent créer des scripts avec des terminaisons de ligne UNIX dans Windows ou fichiers avec des terminaisons de ligne Windows dans Cygwin.


    • Si vous utilisez VIM, vous pouvez effectuer ce qui suit pour changer les terminaisons de ligne et les définir:

      • Pour voir la ligne se terminant dans le fichier actuel, tapez : définir ff? en mode Commande.
      • Pour définir la ligne de fin pour UNIX, tapez : SET FF = UNIX en mode Commande.
      • Pour définir la ligne de fin de Windows, tapez : SET FF = DOS en mode Commande.
      • Si vous utilisez Notepad ++

        • Vous pouvez entrer dans l'élément de menu modifier -> eol Conversion et voir quel paramètre de fin de ligne actuel (c'est celui qui n'est pas mis en surbrillance) et la modifier.
        • Pour que Notepad ++ Utilisez des extrémités de ligne UNIX comme par défaut, entrez dans l'élément de menu Paramètres -> Préférences . Dans la boîte de dialogue, sélectionnez l'onglet Nouvel document / Répertoire par défaut . Dans la section Format faisant partie de la section Nouveau document , sélectionnez la ligne de fin de votre choix. Avertissement: Ne sélectionnez pas Mac en option. Cela ne fonctionne même pas sur les MAC. Si vous avez un Mac, sélectionnez Unix .

1 commentaires

Merci, je vais essayer. BTW J'utilisais Wordpad et cela provoque probablement le problème ..



2
votes

Courir Windows Stuff à Cygwin a un effet secondaire désagréable comme vous l'avez découvert - capturer la sortie des programmes Windows dans une variable de Cygwin Bash, capturera également la sortie CR par le programme.

Utilisation judicieuse de D2U évite le problème - Par exemple, p>

runtime="`mediainfo --Inform='Video;%Duration%' ${movie} | d2u`"


0 commentaires