Ho appena notato che su una delle mie macchine (eseguendo Debian Sid) ogni volta che scrivo ls
un 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$
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'
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 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 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 ls
ora 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 ls
uso delle colonne se in un terminale e in caso contrario stampa una riga per riga, mentre ingannando la ls
stampa 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
}
ls | cat
vedere 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
'*'
. Immagino che andrò in giro aggiungendo ls
alias a tutte le mie macchine per sbarazzarmene ...
QUOTING_STYLE=literal
piuttosto che con un alias. (Immagino sia una questione di gusti, ma preferisco la variabile.)
ls
comando.