web-dev-qa-db-fra.com

Pourquoi «ls» enveloppe-t-il soudainement des éléments avec des espaces entre guillemets simples?

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$

(image)

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'

(image)

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
}
208
Wyatt8740

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:

  • openSUSE (déjà utilisé -N)

" 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é.

141
Jan Kyu Peblik

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.

103
cuonglm

Quelques points sur le changement.

  • Il a été introduit dans coreutils v8.25 et l'alignement amélioré dans v8.26
  • Cela ne se produit que lors de la sortie vers les terminaux, donc ne casse pas les scripts
  • Il supprime l'ambiguïté des utilisateurs pour les fichiers contenant des espaces
  • Il désinfecte la sortie, il est donc sûr de copier et coller
  • La sortie est désormais toujours valide pour copier et coller dans Shell
  • Les utilisateurs peuvent revenir à l'ancien format en ajoutant -N à leur alias ls
46
Pádraig Brady