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 | 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 des ls
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.)
ls
commande.