Je viens de remarquer que sur l'une de mes machines (exécutant Debian Sid) chaque fois que je tape ls
tout nom de fichier avec des espaces est entouré de guillemets simples.
J'ai immédiatement vérifié mes alias, seulement pour les trouver intacts.
[email protected]:~/testdir$ ls
'test 1.txt' test1.txt
[email protected]:~/testdir$ alias
alias ls='ls --color=auto'
alias wget='wget --content-disposition'
[email protected]:~/testdir$
(image)
Autre test, avec des fichiers contenant des guillemets simples dans leurs noms (répondant également à une requête de jimmij) :
[email protected]:~/testdir$ ls
'test 1.txt' test1.txt 'thishasasinglequotehere'''.txt'
[email protected]:~/testdir$ touch "'test 1.txt'"
[email protected]:~/testdir$ ls
''''test 1.txt'''' test1.txt
'test 1.txt' 'thishasasinglequotehere'''.txt'
(image)
mise à jour avec la nouvelle sortie coreutils-8.26 (ce qui est certes beaucoup moins déroutant, mais toujours irritant d'avoir par défaut). Merci à Pádraig Brady pour cette impression :
$ ls
"'test 1.txt'" test1.txt
'test 1.txt' "thishasasinglequotehere'.txt"
$ ls -N
'test 1.txt' test1.txt
test 1.txt thishasasinglequotehere'.txt
Pourquoi cela arrive-t-il? Comment puis-je l'arrêter correctement ?
pour clarifier, j'ai moi-même défini ls pour colorer automatiquement la sortie. Il n'a jamais mis de guillemets autour des choses avant.
J'utilise bash
et coreutils 8.25.
EDIT :
Il semble que les développeurs de coreutils pensaient (lien) que ce serait une bonne idée d'en faire une valeur globale par défaut malgré la rupture du principe du moindre étonnement ainsi que plus de 46 ans de tradition UNIX.
Un moyen de résoudre ce problème sans recompiler ?
MISE À JOUR – Octobre 2017 – Debian Sid a réactivé la citation d'échappement du shell par défaut. Cela devient juste ridicule. https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=877582
Et au bas de la chaîne de réponse au rapport de bogue précédent, "le changement était intentionnel et restera". https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=813164#226
Je pensais que c'était réglé. Apparemment non.
MISE À JOUR :avril 2019 : Je viens de trouver un faux rapport de bogue dans PHP causé par cette modification de ls
. Lorsque vous embrouillez les développeurs et générez de faux rapports de bugs, il est temps de repenser vos modifications.
Mise à jour :Boîte à jouets Android ls
fait maintenant quelque chose de similaire mais avec des barres obliques inverses au lieu de guillemets. L'utilisation de l'option -q rend les espaces en tant que 'caractères de point d'interrogation' (je n'ai pas vérifié ce qu'ils sont, car ce ne sont évidemment pas des espaces), donc le seul correctif que j'ai trouvé jusqu'à présent sans rooter le périphérique en question est d'ajouter this à un script et sourcez-le lors du lancement d'un shell. Cette fonction fait ls
utiliser des colonnes si dans un terminal et sinon imprimer une par ligne, tout en trompant ls
dans les espaces d'impression textuellement parce qu'il traverse un tuyau.
ls() {
# only way I can stop ls from escaping with backslashes
if [ -t 1 ]; then
/system/bin/ls -C [email protected] |cat
else
/system/bin/ls [email protected] |cat
fi
}
Réponse acceptée :
Préface :Bien qu'il puisse être assez satisfaisant de voter pour une réponse comme celle-ci et de l'appeler un jour, soyez assuré que les responsables de GNU coreutils ne se soucient pas des votes de réponse SO, et que si vous le souhaitez réellement pour les encourager à changer , vous devez leur envoyer un e-mail comme décrit dans cette réponse.
Mise à jour 2019 :
Au cours de l'année écoulée, les mainteneurs ont redoublé d'efforts et n'offrent désormais à tous les rapports [protégés par e-mail] sur ce problème qu'une réponse passe-partout pointant vers une page incroyablement longue sur leur site Web répertoriant les problèmes rencontrés par les utilisateurs avec ce changement. qu'ils se sont engagés à ignorer.
La pression incessante des rapports [email protected] a clairement eu un effet, forçant la génération de cette page immense et absurde, et réduisant potentiellement le nombre de mainteneurs prêts à traiter le problème à un seul.
Quand autant de personnes considèrent qu'une chose est un bogue, alors c'est un bogue, que les responsables soient en désaccord ou non.
Continuer à leur envoyer des e-mails reste le moyen le plus simple d'encourager le changement.
"Pourquoi cela se passe-t-il ? “
Connexe :lecture continue à partir d'un tube nommé (chat ou queue -f) ?Plusieurs mainteneurs de coreutils ont décidé qu'ils savaient mieux que des décennies de normes de facto.
"Comment puis-je l'arrêter correctement ? “
http://www.gnu.org/software/coreutils/coreutils.html :
Rapports de bogues
Si vous pensez avoir trouvé un bogue dans Coreutils, veuillez envoyer
un rapport de bogue aussi complet que possible à <[email protected]> , et il
sera automatiquement saisi dans le gestionnaire de bogues de Coreutils. Avant
de signaler des bogues, veuillez lire la FAQ. Un guide très utile et souvent référencé
sur la façon de rédiger des rapports de bogues et de poser de bonnes questions est le
document How To Ask Questions The Smart Way . Vous pouvez parcourir les messages
précédents et rechercher dans l'archive bug-coreutils.
Distros qui ont déjà été inversées ce changement :
Debian coreutils-8.25-2Y compris par conséquent, vraisemblablement, Ubuntu et tous les centaines de dérivés basés sur Debian et Ubuntu
Distributions non affectées :
- openSUSE (déjà utilisé -N)
"Un moyen de résoudre ce problème sans recompiler ? “
Les promoteurs voudraient que vous…
revenir à l'ancien format en ajoutant -N à leur alias ls
…sur toutes vos installations, partout, pour le reste de l'éternité.