Je viens de remarquer que sur 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.
wyatt@debian630:~/testdir$ ls
'test 1.txt' test1.txt
wyatt@debian630:~/testdir$ alias
alias ls='ls --color=auto'
alias wget='wget --content-disposition'
wyatt@debian630:~/testdir$
Autre test, avec des fichiers contenant des guillemets simples dans leurs noms (répondant également à une demande de jimmij):
wyatt@debian630:~/testdir$ ls
'test 1.txt' test1.txt 'thishasasinglequotehere'\''.txt'
wyatt@debian630:~/testdir$ touch "'test 1.txt'"
wyatt@debian630:~/testdir$ ls
''\''test 1.txt'\''' test1.txt
'test 1.txt' 'thishasasinglequotehere'\''.txt'
mise à jour avec une 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 mis ls en sortie de couleur automatique. Il n'a jamais mis de citations autour des choses auparavant.
J'utilise bash
et coreutils 8.25.
EDIT: Apparaît les développeurs de coreutils pensaient (lien) ce serait une bonne idée d'en faire un défaut global malgré la rupture le principe du moindre étonnement ainsi que plus de 46 ans de Tradition UNIX.
Est-il possible de résoudre ce problème sans recompilation?
MISE À JOUR - Octobre 2017 - Debian Sid a réactivé l'échappement Shell par défaut. C'est tout simplement 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 en PHP qui a été causé par ce changement de ls
. Lorsque vous confondez les développeurs et générez de faux rapports de bogues, il est temps de repenser vos modifications.
Mise à jour: Android toybox ls
fait maintenant quelque chose de similaire, mais avec des barres obliques inverses au lieu de guillemets. L'utilisation de l'option -q fait que les espaces s'affichent comme des "caractères de point d'interrogation" (j'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 enraciner le périphérique en question est de l'ajouter à un script et de le source lors du lancement d'un shell. Cette fonction fait ls
utilise des colonnes si dans un terminal et imprime sinon une par ligne, tout en faisant passer ls
dans les espaces d'impression textuellement car il passe par un tube.
ls() {
# only way I can stop ls from escaping with backslashes
if [ -t 1 ]; then
/system/bin/ls -C $@ |cat
else
/system/bin/ls $@ |cat
fi
}
Préface : Bien qu'il puisse être très satisfaisant de voter pour une réponse comme celle-ci et de l'appeler un jour, soyez assuré que le GNU les responsables de coreutils ne se soucient pas de SO réponse aux votes, et que si vous voulez réellement les encourager à changez , vous devez les envoyer par e-mail comme cette réponse le décrit.
Mise à jour 2019 :
Au cours de l'année écoulée, les responsables ont doublé et proposent désormais à tout [email protected] des rapports sur ce problème uniquement une réponse standard indiquant ne page incroyablement longue sur leur site Web répertoriant les problèmes que les gens rencontrent 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 immense et absurde page, et potentiellement réduisant le nombre de mainteneurs prêts à faire face au problème à un seul.
Quand autant de gens considèrent une chose comme un bug, alors c'est un bug que les responsables soient en désaccord ou non.
Continuer à leur envoyer un e-mail reste le moyen le plus simple d'encourager le changement.
" Pourquoi cela se produit-il?"
Plusieurs responsables de coreutils ont décidé qu'ils connaissaient 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 entré dans le suivi des bogues de Coreutils. Avant de signaler des bogues, veuillez lire la FAQ. Un document très utile et souvent référencé sur la façon d'écrire des rapports de bogues et de poser de bonnes questions est le document Comment poser des questions de manière intelligente. Vous pouvez parcourir les articles précédents et rechercher dans l'archive bug-coreutils.
Distros qui ont déjà inversé ce changement:
Distros non affectés:
" Est-il possible de résoudre ce problème sans recompilation?"
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é.
Vous pouvez choisir style de citation :
ls --quoting-style=literal
Le même que:
ls -N
ou:
QUOTING_STYLE=literal ls
Faites-en un alias ou définissez export QUOTING_STYLE=literal
Dans votre .bashrc
Pour obtenir un comportement antérieur à 8.25.
Quelques points sur le changement.