1 votes

Le trait d'union est remplacé par $'. \342\200\224... dans bash

J'ai créé un bash script pour démarrer un ordinateur du réseau s'il est endormi, puis démarrer un client de streaming. Cependant, lorsque le script exécute la commande finale pour lancer le client de diffusion en continu, chaque option cli comportant un trait d'union est enveloppée de $'\342\200\224<option>' . Par exemple -resolution devient $'\342\200\224resolution' .

Plus précisément, cette commande dans le script :

/Applications/Moonlight.app/Contents/MacOS/Moonlight stream "$_target_computer_ip" "$_moonlight_app_name" —resolution "$_moonlight_resolution" —fps "$_moonlight_fps" &>/dev/null &

s'exécute dans le shell en tant que :

/Applications/Moonlight.app/Contents/MacOS/Moonlight stream 192.168.1.30 mstsc.exe $'\342\200\224resolution' 1920x1024 $'\342\200\224fps' 30

J'ai essayé d'échapper le trait d'union en tant que -, mais cela change juste la sortie en $'?\200\224 . Qu'est-ce que je fais de mal ?

Voici le script complet :

#!/bin/bash
set -x

_target_computer_ip='192.168.1.30'
_target_computer_subnet='192.168.1.255'
_target_computer_mac='2C:F0:5D:27:7C:95'

_moonlight_app_name='mstsc.exe'
_moonlight_resolution='1920x1080'
_moonlight_fps='30'

if ping -c 1 -W 1 "$_target_computer_ip"; then
  echo "is alive"
else
  echo "nope"
  wakeonlan -i $_target_computer_subnet $_target_computer_mac
fi

/Applications/Moonlight.app/Contents/MacOS/Moonlight stream "$_target_computer_ip" "$_moonlight_app_name" —resolution "$_moonlight_resolution" —fps "$_moonlight_fps" &>/dev/null &

Et la sortie complète de la commande :

Fayes-MBP:Shell Scripts rain$ ./check_and_wake_pc.sh 
+ _target_computer_ip=192.168.1.30
+ _target_computer_subnet=192.168.1.255
+ _target_computer_mac=2C:F0:5D:27:7C:95
+ _moonlight_app_name=mstsc.exe
+ _moonlight_resolution=1920x1080
+ _moonlight_fps=30
+ echo 192.168.1.30
192.168.1.30
+ ping -c 1 -W 1 192.168.1.30
PING 192.168.1.30 (192.168.1.30): 56 data bytes

--- 192.168.1.30 ping statistics ---
1 packets transmitted, 1 packets received, 0.0% packet loss, 1 packets out of wait time
round-trip min/avg/max/stddev = 3.701/3.701/3.701/0.000 ms
+ echo 'is alive'
is alive
+ /Applications/Moonlight.app/Contents/MacOS/Moonlight stream 192.168.1.30 mstsc.exe $'?\200\224resolution' 1920x1080 $'?\200\224fps' 30

0 votes

Où exactement voyez vous la sortie que vous montrez

0 votes

Dans un terminal. J'ai mis à jour la question avec le résultat complet de la commande.

2voto

TN. Points 3450

Vous utilisez qui est un em-dash au lieu d'un trait d'union ( - ) dans le script. Avec des polices non proportionnelles comme Terminal (ou le formatage de code sur les sites web), c'est difficile à voir ; dans du texte normal, c'est plus évident : - vs -.

Selon cette page Le codage UTF-8 d'un em-dash est le suivant 0xE2 0x80 0x94 et quand vous convertissez cela en octal, vous obtenez 342 200 224 qui sont les chiffres que vous voyez dans votre sortie. (Quelqu'un avec plus de connaissances de bash que moi peut expliquer pourquoi cela se produit).

Les traits d'union sont souvent convertis automatiquement en d'autres types de tirets (sous MacOS, iOS et Windows), ce qui est utile pour la majorité des utilisateurs d'ordinateurs, mais malheureusement pas pour les programmeurs ou les administrateurs système ...

0 votes

Bash's set -x a tendance à convertir les arguments contenant des caractères bizarres/non imprimables en mode de citation ANSI-C (l'option $'...' ), avec les caractères "bizarres" représentés par des échappements octaux. Mais les versions antérieures de bash (avant la v4.4 environ) faisaient cela de manière incohérente, donc dans ce cas, les deuxième et troisième octets ont reçu le traitement de la représentation octale, et l'initiale 0xE2 a été laissé seul. Il imprime comme ? parce que le terminal ne sait pas quoi faire de ce truc cassé not-valid-UTF-8 qu'il a reçu. Les versions ultérieures semblent ne pas toucher à l'ensemble de la séquence UTF-8 (c'est-à-dire qu'il n'y a pas d'encodage octal pour les caractères UTF-8).

0 votes

Ah, oui. C'est la réponse. Merci. J'ai remplacé les em-dashes par des tirets et tout va bien. C'est bizarre que cela soit arrivé. Je ne me souviens pas, mais peut-être avais-je écrit un peu de code dans Notes avant de le transférer dans vscode. Il n'est pas rare que je note des idées dans Notes avant de travailler sur un projet.

LesApples.com

LesApples est une communauté de Apple où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres utilisateurs d'appareils Apple, poser vos propres questions ou résoudre celles des autres.

Powered by:

X