Je viens de remarquer que sur l'une de mes machines (sous Debian Sid), chaque fois que je tape ls
un nom de fichier avec des espaces, il est entouré de guillemets simples.
J'ai immédiatement vérifié mes alias, pour les retrouver 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$
Un 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'
mettre à jour avec la nouvelle sortie de 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 réglé ls sur la sortie couleur automatique. Il ne met jamais de citations autour de choses avant.
Je suis en cours d'exécution bash
et coreutils 8.25.
EDIT: Les développeurs de coreutils ont pensé (lien) que ce serait une bonne idée d’en faire un défaut global malgré la violation du principe de moindre étonnement ainsi que de 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é les citations d'échappement du shell par défaut. C'est juste en train de devenir 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 rapport de bogue volumineux en PHP causé par ce changement 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 à cela, mais avec des barres obliques inverses au lieu de guillemets. L'utilisation de l'option -q rend les espaces rendus en tant que "points d'interrogation" (je n'ai pas vérifié ce qu'ils sont, car ce ne sont évidemment pas des espaces). Le seul correctif que j'ai trouvé jusqu'à présent sans enraciner le périphérique en question consiste à ajouter ceci dans un script et le source lors du lancement d'un shell. Cette fonction ls
utilise des colonnes si elles se trouvent dans un terminal et imprime une ligne par ligne, tout en accédant ls
aux espaces d’impression, mot pour mot, car elle passe par un canal.
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
}
ls
commande.ls | cat
voir si ça s'en va. Si j'avais une machine à remonter le temps, je retournerais à Bell Labs ~ 1970 et essayerais de convaincre Ken Thompson que laisser de la place dans les noms de fichiers et de répertoires est une mauvaise idée. :-P'*'
. J'imagine que je vais ajouter desls
alias à toutes mes machines pour m'en débarrasser ...QUOTING_STYLE=literal
plutôt qu'un alias. (Je suppose que c'est une question de goût, mais je préfère la variable.)Réponses:
Préface : Même s’il peut être très satisfaisant de voter une réponse comme celle-ci et de s’appeler un jour, soyez assuré que les développeurs GNU ne s’intéressent pas aux votes SO, et que si vous voulez réellement les encourager à changer , vous devez envoyez-leur un courriel comme le décrit cette réponse.
" Pourquoi est-ce que ça se passe? "
Plusieurs développeurs 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 :
Distros qui ont déjà rétrocédés ce changement:Debian coreutils-8.25-2Y compris, par conséquent, vraisemblablement Ubuntu et toutes les centaines de dérivés basés sur Debian et UbuntuDistros inchangé:
" Y a-t-il un moyen de résoudre ce problème sans recompiler? "
Les partisans voudraient que vous ...
… Sur toutes vos installations, partout, pour le reste de l'éternité.
la source
ls
ce que vous ne voyez plus, c’est ainsi. Cette fonctionnalité devrait être facultative, pas la valeur par défaut.Vous pouvez choisir un style de citation :
Le même que:
ou:
Faites-en un alias, ou définissez-le
export QUOTING_STYLE=literal
dans le.bashrc
comportement antérieur à 8.25.la source
export QUOTING_STYLE=literal
dans votre base.-N
, semble-t-il. Je suis en train de compiler ma propre version car j'ai déjà un référentiel personnel configuré.literal
place deescape
(je crois que @cuonglm voulait juste montrer comment changer le style, sans cibler spécifiquement leescape
style).Quelques points sur le changement.
la source
ls
cassé? Regardez tous ces arguments contre votre changement. Personne n'en veut. Peut-être qu'il est temps de s'excuser auprès du monde entier et de l'annuler.