L'ho appena notato su una delle mie macchine (che esegue Debian Sid) ogni volta che scrivo ls
qualsiasi nome di file con spazi è racchiuso tra virgolette singole.
Ho immediatamente controllato i miei alias, solo per trovarli intatti.
[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$
(immagine)
Un altro test, con file contenenti virgolette singole nei loro nomi (rispondendo anche a una richiesta di 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'
(immagine)
aggiornamento con il nuovo output di coreutils-8.26 (che è certamente molto meno confuso, ma comunque irritante da avere per impostazione predefinita). Grazie a Pádraig Brady per questa stampa:
$ ls
"'test 1.txt'" test1.txt
'test 1.txt' "thishasasinglequotehere'.txt"
$ ls -N
'test 1.txt' test1.txt
test 1.txt thishasasinglequotehere'.txt
Perché sta succedendo? Come faccio a fermarlo correttamente?
per chiarire, io stesso ho impostato ls per colorare automaticamente l'output. Non ha mai messo virgolette sulle cose prima.
Sto eseguendo bash
e coreutils 8.25.
EDIT:
Sembra che gli sviluppatori di coreutils abbiano pensato (link) che sarebbe una buona idea renderlo un default globale nonostante la violazione del principio del minimo stupore e oltre 46 anni di tradizione UNIX.
Un modo per risolvere questo problema senza una ricompilazione?
AGGIORNAMENTO – ottobre 2017 – Debian Sid ha riattivato la citazione di escape della shell per impostazione predefinita. Questo sta diventando ridicolo. https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=877582
E in fondo alla catena di risposta alla precedente segnalazione di bug, "la modifica era intenzionale e rimarrà". https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=813164#226
Ho pensato che questo fosse risolto. A quanto pare no.
AGGIORNAMENTO:aprile 2019:ho appena trovato una segnalazione di bug spuria in PHP causata da questa modifica a ls
. Quando stai confondendo gli sviluppatori e generando false segnalazioni di bug, è tempo di ripensare alle tue modifiche.
Aggiornamento:scatola dei giochi Android ls
ora sta facendo qualcosa di simile a questo ma con barre inverse anziché virgolette. L'uso dell'opzione -q rende gli spazi visualizzati come "caratteri punto interrogativo" (non ho verificato quali sono, poiché ovviamente non sono spazi), quindi l'unica soluzione che ho trovato finora senza eseguire il root del dispositivo in questione è aggiungere questo in uno script e procurarselo all'avvio di una shell. Questa funzione crea ls
usa le colonne se in un terminale e altrimenti stampa una per riga, ingannando ls
negli spazi di stampa testualmente perché scorre attraverso una pipe.
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
}
Risposta accettata:
Prefazione :Anche se può essere abbastanza soddisfacente votare una risposta come questa e farla finita, ti assicuriamo che i manutentori di GNU coreutils non si preoccupano dei voti delle risposte SO e che se lo desideri davvero per incoraggiarli a cambiare , devi inviargli un'email come descrive questa risposta.
Aggiornamento 2019 :
Qualche volta lo scorso anno i manutentori sono raddoppiati e ora offrono a qualsiasi segnalazione [protetta tramite posta elettronica] su questo problema solo una risposta standard che indica una pagina incredibilmente lunga sul loro sito Web che elenca i problemi che le persone hanno con questa modifica che si sono impegnati a ignorare.
La pressione incessante dei rapporti [protetti tramite posta elettronica] ha chiaramente avuto un effetto, costringendo la generazione di questa pagina immensa e assurda e riducendo potenzialmente a uno solo il numero di manutentori disposti ad affrontare il problema.
Quando così tante persone considerano una cosa un bug, allora è un bug indipendentemente dal fatto che i manutentori siano in disaccordo o meno.
Continuando a inviarli via email rimane il modo più semplice per incoraggiare il cambiamento.
"Perché sta accadendo? “
Correlati:lettura continua da named pipe (cat o tail -f)?Diversi manutentori di coreutils hanno deciso di conoscere meglio di decenni di standard de facto.
"Come faccio a interromperlo correttamente? “
http://www.gnu.org/software/coreutils/coreutils.html:
Segnalazioni di bug
Se ritieni di aver trovato un bug in Coreutils, invia il più
completo di segnalazione di bug possibile a <[email protected]> e
verrà inserito automaticamente nel bug tracker di Coreutils. Prima di
segnalare bug, leggi le FAQ. Una guida molto utile e spesso citata
su come scrivere segnalazioni di bug e porre buone domande è il documento
How To Ask Questions The Smart Way . Puoi sfogliare i post
precedenti e cercare nell'archivio bug-coreutils.
Distribuzioni che sono già ripristinate questa modifica:
Debian coreutils-8.25-2Compreso di conseguenza, presumibilmente, Ubuntu e tutte le centinaia di derivati basati su Debian e Ubuntu
Distribuzioni inalterate:
- openSUSE (già usato -N)
"Un modo per risolvere questo problema senza una ricompilazione? “
I fautori ti vorrebbero...
torna al vecchio formato aggiungendo -N al loro alias ls
...su tutte le tue installazioni, ovunque, per il resto dell'eternità.