Perché 'ls' sta improvvisamente avvolgendo oggetti con spazi tra virgolette singole?


187

Ho appena notato che su una delle mie macchine (eseguendo Debian Sid) ogni volta che scrivo lsun nome di file con spazi racchiuso tra virgolette.

Ho immediatamente controllato i miei alias, solo per trovarli intatti.

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$

(immagine)

Un altro test, con file contenenti virgolette singole nei loro nomi (anche rispondendo a una richiesta di 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'

(immagine)

aggiornamento con il nuovo output coreutils-8.26 (che è certamente molto meno confuso, ma comunque irritante avere di default). 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 posso fermarlo correttamente?

per chiarire, io stesso ho impostato ls per colorare automaticamente l'output. Non ha mai messo citazioni intorno a cose prima.

Sto correndo bashe coreutils 8.25.

EDIT: Sembra che gli sviluppatori di coreutils abbiano pensato (link) che sarebbe una buona idea renderlo un default globale nonostante infrangendo il principio del minimo stupore e oltre 46 anni di tradizione UNIX.

Un modo per risolvere questo problema senza ricompilare?


AGGIORNAMENTO - Ottobre 2017 - Debian Sid ha riabilitato le quotazioni 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 al precedente bug report, "il cambiamento era intenzionale e rimarrà". https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=813164#226

Pensavo fosse risolto. Apparentemente no.

AGGIORNAMENTO: aprile 2019: ho appena trovato un bug report in PHP causato da questa modifica ls. Quando confondi gli sviluppatori e generi segnalazioni di bug falsi, è tempo di ripensare le tue modifiche.

Aggiornamento: Android Toybox lsora sta facendo qualcosa di simile a questo ma con barre rovesciate anziché virgolette. L'uso dell'opzione -q rende gli spazi renderizzati come "caratteri punto interrogativo" (non ho verificato quali siano, poiché ovviamente non sono spazi), quindi l'unica soluzione che ho trovato finora senza il rooting del dispositivo in questione è quella di aggiungere questo a uno script e lo procura all'avvio di una shell. Questa funzione fa lsuso delle colonne se in un terminale e in caso contrario stampa una riga per riga, mentre ingannando la lsstampa degli spazi alla lettera perché scorre attraverso una pipe.

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
}

20
Ancora un altro motivo per cui non analizzare il lscomando.
Jimmij,

12
Sembra strano ma se è abilitato solo quando si stampa su un terminale ha senso. Puoi vedere chiaramente che hai un file "test 1.txt" anziché un file "test" e un altro "1.txt". Prova a ls | catvedere se scompare. Se avessi una macchina del tempo, tornerei ai Bell Labs ~ 1970 e proverei a convincere Ken Thompson che lasciare spazio ai nomi di file e directory è una cattiva idea. :-P
Bjorn Munch

6
Quando l'ho visto per la prima volta, sono impazzito, pensando che uno dei miei script fosse andato storto e ribattezzato tutti i miei file '*'. Immagino che andrò in giro aggiungendo lsalias a tutte le mie macchine per sbarazzarmene ...
Espiazione limitata

14
@LimitedAtonement, come sottolineato da Lekensteyn , puoi farlo con una variabile d'ambiente QUOTING_STYLE=literalpiuttosto che con un alias. (Immagino sia una questione di gusti, ma preferisco la variabile.)
LSpice,

4
@BjornMunch ci sono due soluzioni al problema di dire se si tratta di uno o due file: 1) cercare come vengono disegnate le colonne ed è abbastanza ovvio. 2) elenca un elemento per riga. Entrambi hanno un aspetto migliore e più chiaro rispetto alla manipolazione con virgolette singole.
Wyatt8740,

Risposte:


132

Prefazione : anche se può essere abbastanza soddisfacente votare una risposta come questa e chiamarla un giorno, ti assicuriamo che gli sviluppatori GNU non si preoccupano dei voti di risposta SO, e che se vuoi davvero incoraggiarli a cambiare , devi e-mail come descrive questa risposta.


" Perché sta succedendo questo? "

Diversi sviluppatori di coreutils hanno deciso di conoscere meglio di decenni gli standard di fatto.


" Come posso fermarlo correttamente? "

http://www.gnu.org/software/coreutils/coreutils.html :

Segnalazioni di errori

Se ritieni di aver trovato un bug in Coreutils, invia una segnalazione di bug il più completa possibile a <bug-coreutils@gnu.org> e verrà automaticamente inserito nel tracker dei bug di Coreutils. Prima di segnalare bug, leggi le FAQ. Una guida molto utile e spesso referenziata su come scrivere segnalazioni di bug e porre buone domande è il documento Come porre domande in modo intelligente. Puoi sfogliare le pubblicazioni precedenti e cercare nell'archivio bug-coreutils.

Le distro che hanno già ripristinato  questo cambiamento:

Distro non interessato:

  • openSUSE (già usato -N)

" Un modo per risolvere questo problema senza ricompilare? "

I sostenitori ti vorrebbero ...

tornare al vecchio formato aggiungendo -N al loro alias

... su tutte le tue installazioni, ovunque, per il resto dell'eternità.


17
La modifica è stata proposta sulla mailing list e concordata da tre manutentori di coreutils come un vantaggio netto. Siamo completamente aperti a argomentazioni costruttive al riguardo. Dopotutto, questo è open source, non intendiamo dettare, ma solo migliorare le cose. Non esitate a rispondere nel thread coreutils su lists.gnu.org/archive/html/coreutils/2016-02/msg00000.html (A proposito, c'era un suggerimento costruttivo per migliorare uno degli svantaggi estetici menzionati lì, aggiungendo uno spazio per migliorare l'allineamento)
Pádraig Brady,

31
@ PádraigBrady Risposta aggiornata. Vedendo un sacco di diniego nel thread coreutils, però. La linea di fondo è che stai creando più lavoro per le persone e lo stai facendo nel nome di un sistema operativo che è un clone di un sistema operativo dal 1970. Se le persone vogliono qualcosa di diverso, opteranno per esso.
Jan Kyu Peblik,

43
@ PádraigBrady Questa modifica mi ha causato fastidio e ha sprecato diverse ore nel tentativo di trovare una causa e una soluzione. Non intendo essere negativo - sto solo condividendo il punto di vista di un'altra persona! La modifica del comportamento di base ha enormi implicazioni ..
mafrosi

52
Come qualcuno che usa i sistemi * nix da 30 anni, trovo che i cambiamenti gratuiti come questo siano piuttosto fastidiosi. Rompono gli script di vecchia data, per prima cosa. Inoltre violano il principio del minimo stupore. "Opt-in" avrebbe dovuto essere l'impostazione predefinita qui, come indicato sopra.
Brian Clapper,

28
@ PádraigBrady Questo non è ancora il modo per spingere tali cambiamenti. Sarebbe stato molto più costruttivo avere quel comportamento opt-in anziché attivo per impostazione predefinita. Inoltre suggerisce erroneamente che questo è il modo in cui sono archiviati i nomi dei file, in breve con lsquello che vedi non è più come è archiviato. Tale funzione dovrebbe essere facoltativa, non predefinita.

91

Puoi scegliere lo stile di quotazione :

ls --quoting-style=literal

Lo stesso di:

ls -N

o:

QUOTING_STYLE=literal ls

Trasformalo in un alias o imposta il export QUOTING_STYLE=literaltuo .bashrcper ottenere un comportamento precedente alla 8.25.


11
sembra un po 'strano che devo farlo per ottenere il normale comportamento unix-y. Inoltre, voglio il vecchio predefinito. Non credo che fuggire fosse il vecchio default - penso che stampasse esattamente ciò che era effettivamente lì.
Wyatt8740,

9
Per un comportamento precedente alla 8.25, utilizzare export QUOTING_STYLE=literalnel proprio bashrc.
Lekensteyn,

2
o usare -N, a quanto pare. Sto solo compilando la mia versione poiché ho già impostato un repository personale.
Wyatt8740,

2
@LSpice Ho modificato il post da utilizzare literalinvece di escape(credo che @cuonglm volesse solo mostrare come cambiare lo stile, non specificando come target lo escapestile).
Lekensteyn,

5
Questa risposta merita più voti. Si rivolge direttamente a ciò che l'interrogante ha chiesto evitando una risposta burocratica. In effetti, l'approccio variabile d'ambiente sembra piuttosto elegante. (Personalmente preferisco il nuovo comportamento in quanto favorisce un'azione C&P più efficiente), tuttavia, ls è abbastanza intelligente da comportarsi alla vecchia maniera quando viene utilizzato un reindirizzamento, quindi nessun danno agli script che usano l'output di ls.
Marcelo,

42

Alcuni punti sul cambiamento.

  • È stato introdotto in coreutils v8.25 e l'allineamento è migliorato in v8.26
  • Succede solo quando si invia ai terminali, quindi non si rompono gli script
  • Disambigua l'output per gli utenti per i file contenenti spazi bianchi
  • Disinfetta l'output, quindi è sicuro da copiare e incollare
  • L'output ora è sempre valido per copiare e incollare nuovamente nella shell
  • Gli utenti possono tornare al vecchio formato aggiungendo -N al loro alias

7
il mio ultimo esempio non è ambiguo? Forse no - ma è sicuramente confuso e richiede più tempo per decifrare. Penso che sia un terribile cambiamento (senza offesa per te). Grazie per il suggerimento alias però.
Wyatt8740,

27
Nota: questa modifica è stata introdotta in coreutils 8.25 ( commit , creato dallo stesso Pádraig di questo post). Personalmente penso che questo comportamento non sia ottimale, interrompe l'allineamento ogni volta che si verifica uno spazio in un nome file.
Lekensteyn,

10
le mie scuse - apparentemente stai tranquillamente citando le citazioni di shell almeno. non mi piace ancora. le opzioni vanno bene, ma modificare il comportamento predefinito molto ben specificato di un'utilità core unix vecchia di decenni in modo tale da ridurne la veridicità non può che essere una cattiva idea.
Mikeserv,

12
@ PádraigBrady Quindi, ti manterrai lsrotto? Guarda tutti quegli argomenti contro il tuo cambiamento. Nessuno lo vuole. Forse è tempo di scusarsi con il mondo e annullarlo.
Chris Warrick,

6
@ PádraigBrady Quindi, nonostante le molte persone che hanno spiegato come sia sbagliato, rotto, ecc., Non lo ripristinerai ancora in modo che l'impostazione predefinita sia invariata? Contrariamente alla tua convinzione, questo cambiamento confonde non disambigua. Suggerire che le persone impostano una variabile di ambiente o un alias è asinina, nella migliore delle ipotesi.
Mark
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.